Перезагрузить программно 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": ошибка =13, в доступе отказано

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

<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 ответа

Решение

/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 разрешение

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

Как примечание, изображения разработчика для Android Things построены как userdebugЭто означает, что вы можете получить доступ к root из оболочки, просто перезагрузив демон ADB с adb root Команда, прежде чем пытаться получить доступ к оболочке. Это дает вам любой доступ с правами 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");

Другие вопросы по тегам