以编程方式关闭设备

Kno*_*sos 24 android

我正在编写一个旨在在一个特定设备模型(运行基于Amlogic的固件的Android机顶设备)上运行的应用程序.我有两个root功能,我的应用程序使用固件证书签名.

我的应用程序是该设备的主要关注点,能够启动完全关闭电源会很有帮助.

我没有这个shutdown命令.我确实有这个reboot命令.

reboot -p没有帮助.它只是在保持通电状态时冻结设备.

PowerManager是更好的一步,但它将设备设置为睡眠模式,而不是完全关闭:

PowerManager pm = (PowerManager)getSystemService(Service.POWER_SERVICE);
pm.goToSleep(SystemClock.uptimeMillis());
Run Code Online (Sandbox Code Playgroud)

我对所有建议持开放态度 - 黑客或其他.Android的版本预计将继续保留4.2.2.


意图

此命令将导致设备重新启动.Intent.ACTION_SHUTDOWN似乎没有做任何事情.这个Intent可能只是报告关闭,而不是发起关闭吗?

Intent i = new Intent(Intent.ACTION_REBOOT);
i.putExtra("nowait", 1);
i.putExtra("interval", 1);
i.putExtra("window", 0);
sendBroadcast(i);
Run Code Online (Sandbox Code Playgroud)

我最幸运的是要求Intent关闭:

Intent i = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
i.putExtra("android.intent.extra.KEY_CONFIRM", true);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)

关机线程

那更接近了.绝对有趣.你能找到一个使用它的例子吗?

到目前为止,我已经想出了这个:

Class<?> sdClass = Class.forName("com.android.server.power.ShutdownThread");
Constructor<?> con = sdClass.getDeclaredConstructors()[0];
con.setAccessible(true);

for (Method m : sdClass.getDeclaredMethods()) {
    if (m.getName().matches("shutdown")) {
        m.setAccessible(true);
        m.invoke(sdClass, PlayerActivity.this, false);
    } else if (m.getName().matches("rebootOrShutdown")) {
        m.setAccessible(true);
        m.invoke(sdClass, PlayerActivity.this, false);
    } else if (m.getName().matches("beginShutdownSequence")) {
        m.setAccessible(true);
        m.invoke(sdClass, PlayerActivity.this, false);
    }
}
Run Code Online (Sandbox Code Playgroud)

shutdownbeginShutdownSequence创建NullPointerExceptions(你明白为什么?)并rebootOrShutdown创建一个InvocationTargetException由于UnsatisfiedLinkError...它找不到本机方法:

java.lang.UnsatisfiedLinkError:找不到本机方法:com.android.server.power.PowerManagerService.nativeShutdown :()V在com.android.server.power上的com.android.server.power.PowerManagerService.nativeShutdown(本机方法) com.android.server.power.ShutdownThread.rebootOrShutdown(ShutdownThread.java:543)中的.PowerManagerService.lowLevelShutdown(PowerManagerService.java:2163)at com.android.server.power.ShutdownThread.run(ShutdownThread.java:393)

lowLevelShutdown是配置为关闭(而不是重新启动)时所有功能最终到达的功能.因此,弄清楚如何避免这种链接错误可能是关键.

Kno*_*sos 17

就我而言,我认为不可能按照我的意愿关闭设备.

我设法达到目标的最接近的是使用:

Intent i = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
i.putExtra("android.intent.extra.KEY_CONFIRM", true);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)

这会打开一个关闭设备的对话框.这是一个完美的解决方案,但在我的情况下,使用它会导致设备崩溃.可能是我的设备有些特殊,其他设备不会有这些限制.

无论如何,我希望我的测试能帮助他人完成任务.

  • 你真的应该为此提出一个新问题。 (2认同)
  • 此解决方案需要“android.permission.SHUTDOWN”权限,并且该权限仅适用于系统应用程序,另请参见 http://stackoverflow.com/a/14065879/1545993 (2认同)

Yog*_*thi 6

它在root设备上适用于我.如果您的设备已植根,则可以使用以下方法

关掉:

try {
    Process proc = Runtime.getRuntime()
                    .exec(new String[]{ "su", "-c", "reboot -p" });
    proc.waitFor();
} catch (Exception ex) {
    ex.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

重新开始:

相同的代码,只需使用"reboot"而不是"reboot -p".

  • 我需要做`“su”,“0”,“rebo​​ot”,“-p”` (2认同)

小智 5

Runtime.getRuntime().exec(new String[]{ "su", "-c", "reboot -p" });
Run Code Online (Sandbox Code Playgroud)

它工作,只有root设备!


Rod*_*ijo 5

要使用此代码,您需要超级用户!适用于4.0及以上版本!

  Intent i = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
            i.putExtra("android.intent.extra.KEY_CONFIRM", false);
            i.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);
Run Code Online (Sandbox Code Playgroud)

并将此权限放在清单上:

<uses-permission android:name="android.permission.SHUTDOWN" /> 
Run Code Online (Sandbox Code Playgroud)