以编程方式重新启动Android Things

时间:2017-05-23 08:21:57

标签: java runtime.exec android-things

我想使用此代码重新启动运行 Android Things RPI3

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:无法运行程序“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"/>

我错过了什么吗?

4 个答案:

答案 0 :(得分:5)

DP 4 中的

/system/bin/reboot二进制文件,与之前的所有开发预览一样,具有世界可执行权限,即以下产量

adb shell ls -l /system/bin | grep reboot
-rwxr-xr-x 1 root shell   ... reboot

也就是说,可以为任何用户( Android 中的a.k.a应用程序进程)执行二进制文件,而无需抓取su。只需在 Java 中执行

即可

<强>重新启动

Runtime.getRuntime().exec("reboot");

关闭电源

Runtime.getRuntime().exec("reboot -p");

AndroidManifest.xml无需成功即可成功运行二进制文件。

警告:如果在较新的操作系统版本中更改安全模型,则此方法可能无效。

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

在未来的开发人员预览版中,对Android Things上运行的应用程序可以访问受系统保护的功能(例如PowerManager.reboot() API提供的功能)。您不能(也不应该)尝试通过su以root用户身份运行您的应用流程。

作为旁注,Android Things的开发人员映像构建为userdebug,这意味着您可以在尝试使用adb root命令重新启动ADB守护程序之前从shell访问root用户访问shell。这为您提供了在开发过程中可能需要的任何root访问权限,而不会影响设备安全性并允许应用程序进程以root身份运行。

答案 3 :(得分:0)

您需要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");