Перезагрузите программное обеспечение 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: невозможно запустить программу «su»: error = 13, Permission denied

Я добавляю к манифесту все разрешения

                

Я что-то упускаю?

/system/bin/reboot в DP 4 , так, как и во всех предыдущих предварительных предварительных версиях Dev, имеет разрешение, выполняемое во всем мире, то есть следующие выходы

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

Тем не менее, еще можно выполнить двоичный код для любого пользователя (например, процесс приложения на Android ) без необходимости захвата su . Просто выполните на Java для

перезагрузка

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

или для выключения

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

В AndroidManifest.xml требуется разрешение для успешного запуска двоичного файла.

Теперь вы можете выполнить перезагрузку, используя:

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

Доступ к системно-защищенным функциям (например, предоставленным API PowerManager.reboot() ) будет доступен для приложений, работающих на Android Things, в будущем выпуске предварительного просмотра разработчиков. Вы не можете (и не должны) пытаться запустить ваш процесс приложения в качестве пользователя root через su .

В качестве дополнительной заметки изображения разработчика для Android Things создаются как userdebug , а это userdebug , что вы можете получить доступ к корневому userdebug из оболочки, просто перезагрузив ADB-демона командой adb root прежде чем пытаться получить доступ к оболочке. Это дает вам любой корневой доступ, который вам может понадобиться во время разработки, без ущерба для безопасности устройства и позволяя процессам приложений запускаться с правами root.

Вам нужен 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");