如何通过android中的代码关闭和重启模拟器?

时间:2011-04-12 13:10:55

标签: java android

我已经实现了代码:

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=***

4 个答案:

答案 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;
}