我想使用此代码重新启动运行 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"/>
我错过了什么吗?
答案 0 :(得分:5)
/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)
您现在可以使用以下方式重新启动:
实施例
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");