以编程方式重启 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 版本中发生变化,此方法可能无效。

您现在可以使用以下方式重新启动:

https://developer.android.com/things/reference/com/google/android/things/devicemanagement/DeviceManager.html

示例

 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 权限