以编程方式重启 Android 事情
Reboot programmatically Android Things
我想使用此代码重新启动我的 RPI3 运行 Android Things:
public static void Reboot()
{
try {
Process proc = Runtime.getRuntime().exec(new String[]{"su", "-c", "reboot"});
proc.waitFor();
} catch (Exception ex) {
ex.printStackTrace();
}
}
我收到以下错误:
java.io.IOException: Cannot run program "su": error=13, Permission denied
我在清单中添加了所有权限
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.SET_TIME_ZONE"/>
<uses-permission android:name="android.permission.SHUTDOWN"/>
我是不是漏掉了什么?
您需要 root 权限。
public static void runCmd(String cmd) {
DataOutputStream os;
try {
Process process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(cmd + "\n");
os.writeBytes("exit\n");
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
然后您可以 运行 任何需要 root 访问权限的命令,如下所示:runCmd("reboot");
对系统保护功能(例如 PowerManager.reboot()
API 提供的功能)的访问权限将在 运行ning Android 以后的应用程序中可用开发者预览版。您不能(也不应该)尝试通过 su
.
以 root 用户身份 运行 您的应用进程
附带说明一下,Android 的开发者镜像构建为 userdebug
,这意味着您可以从 shell 访问 root,只需使用adb root
命令,然后再尝试访问 shell。这为您提供了在开发过程中可能需要的任何 root 访问权限,而不会损害设备安全并允许应用程序进程以 root 身份 运行。
/system/bin/reboot
DP 4 中的二进制文件,因此在所有之前的开发预览中,具有世界可执行权限,即以下产量
adb shell ls -l /system/bin | grep reboot
-rwxr-xr-x 1 root shell ... reboot
也就是说,仍然可以为任何用户(Android 中的a.k.a 应用程序进程执行二进制文件,而无需获取 su
。只需执行 in Java for
正在重启
Runtime.getRuntime().exec("reboot");
或关机
Runtime.getRuntime().exec("reboot -p");
在 AndroidManifest.xml
中不需要权限 成功地 运行 二进制文件。
注意:如果安全模型在较新的 OS 版本中发生变化,此方法可能无效。
您现在可以使用以下方式重新启动:
示例
public class SomeActivity extends Activity {
void doReboot() {
DeviceManager.getInstance().reboot();
}
void doFactoryReset() {
boolean wipeExternalCard = true;
DeviceManager.getInstance().factoryReset(wipeExternalCard);
}
}
您需要 com.google.android.things.permission.REBOOT
权限
我想使用此代码重新启动我的 RPI3 运行 Android Things:
public static void Reboot()
{
try {
Process proc = Runtime.getRuntime().exec(new String[]{"su", "-c", "reboot"});
proc.waitFor();
} catch (Exception ex) {
ex.printStackTrace();
}
}
我收到以下错误:
java.io.IOException: Cannot run program "su": error=13, Permission denied
我在清单中添加了所有权限
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.SET_TIME_ZONE"/>
<uses-permission android:name="android.permission.SHUTDOWN"/>
我是不是漏掉了什么?
您需要 root 权限。
public static void runCmd(String cmd) {
DataOutputStream os;
try {
Process process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(cmd + "\n");
os.writeBytes("exit\n");
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
然后您可以 运行 任何需要 root 访问权限的命令,如下所示:runCmd("reboot");
对系统保护功能(例如 PowerManager.reboot()
API 提供的功能)的访问权限将在 运行ning Android 以后的应用程序中可用开发者预览版。您不能(也不应该)尝试通过 su
.
附带说明一下,Android 的开发者镜像构建为 userdebug
,这意味着您可以从 shell 访问 root,只需使用adb root
命令,然后再尝试访问 shell。这为您提供了在开发过程中可能需要的任何 root 访问权限,而不会损害设备安全并允许应用程序进程以 root 身份 运行。
/system/bin/reboot
DP 4 中的二进制文件,因此在所有之前的开发预览中,具有世界可执行权限,即以下产量
adb shell ls -l /system/bin | grep reboot
-rwxr-xr-x 1 root shell ... reboot
也就是说,仍然可以为任何用户(Android 中的a.k.a 应用程序进程执行二进制文件,而无需获取 su
。只需执行 in Java for
正在重启
Runtime.getRuntime().exec("reboot");
或关机
Runtime.getRuntime().exec("reboot -p");
在 AndroidManifest.xml
中不需要权限 成功地 运行 二进制文件。
注意:如果安全模型在较新的 OS 版本中发生变化,此方法可能无效。
您现在可以使用以下方式重新启动:
示例
public class SomeActivity extends Activity {
void doReboot() {
DeviceManager.getInstance().reboot();
}
void doFactoryReset() {
boolean wipeExternalCard = true;
DeviceManager.getInstance().factoryReset(wipeExternalCard);
}
}
您需要 com.google.android.things.permission.REBOOT
权限