Reboot Android Things Software

I want to use this code to restart my RPI3 running Android Things:

public static void Reboot()
{
    try {
        Process proc = Runtime.getRuntime().exec(new String[]{"su", "-c", "reboot"});
        proc.waitFor();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

I get the following error:

java.io.IOException: cannot start program "su": error = 13, Permission denied

I add all permissions to the manifest

<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"/>

Did I miss something?

+2
source share
4 answers

/system/bin/reboot binary code in DP 4, as in all previous pre-release versions of dev, has permission that is executed worldwide, that is, the following values

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

, ( a.k.a Android) su. Java

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

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

AndroidManifest.xml .

+4

, :

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

+3

(, API PowerManager.reboot()) , Android Things, . ( ) root su.

, Android Things userdebug, , , ADB- adb root, . , , .

+2

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");

0

Source: https://habr.com/ru/post/1676727/