Перезагрузить программно 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
чтобы запустить двоичный файл успешно.
Внимание: в случае изменения модели безопасности в более новых версиях ОС этот подход может не сработать.
Теперь вы можете выполнить перезагрузку, используя:
пример
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");