我已经实现了代码:
Intent i = new Intent(Intent.ACTION_REBOOT);
sendBroadcast(i);
它得到错误(运行时):
java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.REBOOT from pid=*** and uid=***
答案 0 :(得分:1)
普通SDK应用程序无法导致手机关机或重启。只有属于固件的应用程序(即由固件主题密钥签名)才能保留适当的权限并执行这些操作。
答案 1 :(得分:1)
我没有尝试过这个,我认为从代码重启会有(并且应该)很多限制。但您可以尝试检查权限:
<uses-permission android:name="android.permission.REBOOT" />
从here我读到你可能需要一些额外的无证件:
Intent i = new Intent(Intent.ACTION_REBOOT);
i.putExtra("nowait", 1);
i.putExtra("interval", 1);
i.putExtra("window", 0);
sendBroadcast(i);
特别注意该链接中的句子:
不仅不在API文档中, 但因为正如你所说,你需要成为 用平台证书签名,你可以 只有在你运行的时候才使用它 你有系统软件的设备 建立自己。
答案 2 :(得分:0)
在android SDK文档中,我看到有关Intent.ACTION_REBOOt的注释。它说,“这是一个只能由系统发送的受保护意图”。 我认为出于安全原因,您无权使用此意图重启设备。
答案 3 :(得分:0)
看看这个。但是,您需要安装busybox。
public static boolean selfShutdown() {
boolean bOK = false;
String telnetCmd = "busybox telnet 10.0.2.2 5554";
String cmd = "kill";
try {
String out = String.format("telnetCmd=%s", telnetCmd);
Log.i(TAG+".selfShutdown", out);
Process p = Runtime.getRuntime().exec(telnetCmd);
DataOutputStream os = new DataOutputStream(p.getOutputStream());
String command = String.format("%s\n", cmd);
os.writeBytes(command);
os.flush();
out = String.format("%s", "complete os.flush()");
Log.i(TAG+".selfShutdown", out);
p.waitFor();
out = String.format("%s", "complete p.waitFor()");
Log.i(TAG+".selfShutdown", out);
bOK = true;
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return bOK;
}