我正在尝试制作可以停止电池充电的 Android 应用程序。
我的Android设备运行Android 12,该应用程序的build.gradle中compileSdk的值为32。
当然,我的 Android 设备已 root。
我遵循了这个问题并通过运行“setenforce 0”命令禁用了SELinux。
我发现我可以通过将“/sys/class/power_supply/battery/input_suspend”的值从0更改为1来停止电池充电。
我已通过在连接 Android 设备的 PC 上运行以下命令来确认我确实可以通过这样做来停止电池充电:
adb shell su
echo 1 > /sys/class/power_supply/battery/input_suspend
这效果很好。所以我开始创建使用这种方法的应用程序。
本App的MainActivity.java:
package com.example.chargedisabler;
import static android.content.ContentValues.TAG;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
Runtime.getRuntime().exec("su -c \"echo 1 > /sys/class/power_supply/battery/input_suspend\"");
} catch (IOException e) {
e.printStackTrace();
}
}
}
这不起作用。即使授予Root权限,充电也没有停止。
我改变了方法,更改了MainActivity.java如下:
package com.example.chargedisabler;
import static android.content.ContentValues.TAG;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.io.IOException;
import java.io.OutputStream;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
Process p = Runtime.getRuntime().exec("su");
OutputStream OStrm = p.getOutputStream();
OStrm.write(("echo 1 > /sys/class/power_supply/battery/input_suspend\n").getBytes("UTF-8"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
这也不起作用。
接下来,在连接Android设备的PC上,我尝试以与以前不同的方式停止电池充电:
adb shell su -c "echo 1 > /sys/class/power_supply/battery/input_suspend"
奇怪的是,该命令输出以下内容:
/system/bin/sh: can't create /sys/class/power_supply/battery/input_suspend: Permission denied
当我尝试以类似的方式读取内容时,不知怎的,文件可以成功读取:
adb shell su -c "cat /sys/class/power_supply/battery/input_suspend"
该命令输出“0”。
似乎除非以某种正确的方式执行该命令,否则该文件将被保密以进行写入。
如何从应用程序内更改“/sys/class/power_supply/battery/input_suspend”的值?
或者是否有适用于任何设备的更好的停止充电方法?
您可以在我的 GitHub 帐户上找到 MyRootModule.kt 文件。我为 React Native 项目创建了它,但您也可以在 Android Studio 中使用它。您的 su -c ... 命令有时不起作用,这是正常的。
首先获得超级用户访问权限,然后执行不带“su -c”的命令 https://github.com/umutsar/ReactNativeSuperuser