我正在编写一个应用程序,旨在在一种特定的设备型号(运行基于 Amlogic 的固件的 Android 机顶设备)上运行。我具有 root 功能,并且我的应用程序是使用固件证书签名的。
我的应用程序是设备的主要焦点,如果能够启动完全关闭电源将会很有帮助。
我没有shutdown
命令。我确实有reboot
命令。
reboot -p
没有帮助。它只是冻结设备,同时保持通电状态。
The PowerManager
好一步,但它将设备设置为睡眠模式,而不是完全关闭:
PowerManager pm = (PowerManager)getSystemService(Service.POWER_SERVICE);
pm.goToSleep(SystemClock.uptimeMillis());
我愿意接受所有建议——黑客或其他建议。 Android版本预计维持在4.2.2
.
Intents
该命令将导致设备重新启动。Intent.ACTION_SHUTDOWN
似乎没有做任何事情。此意图是否可能只是报告关闭,而不是启动关闭?
Intent i = new Intent(Intent.ACTION_REBOOT);
i.putExtra("nowait", 1);
i.putExtra("interval", 1);
i.putExtra("window", 0);
sendBroadcast(i);
我最幸运的是通过 Intent 请求关闭:
Intent i = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
i.putExtra("android.intent.extra.KEY_CONFIRM", true);
startActivity(i);
关闭线程
那就更近一点了。绝对有趣。你能找到一个使用它的例子吗?
到目前为止我已经想出了这个:
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);
}
}
shutdown
and beginShutdownSequence
create NullPointerException
s(你明白为什么吗?)和rebootOrShutdown
创建一个InvocationTargetException
由于UnsatisfiedLinkError
...它找不到本机方法:
java.lang.UnsatisfiedLinkError:找不到本机方法:
com.android.server.power.PowerManagerService.nativeShutdown:()V at
com.android.server.power.PowerManagerService.nativeShutdown(本机
方法)在
com.android.server.power.PowerManagerService.lowLevelShutdown(PowerManagerService.java:2163)
在
com.android.server.power.ShutdownThread.rebootOrShutdown(ShutdownThread.java:543)
在
com.android.server.power.ShutdownThread.run(ShutdownThread.java:393)
lowLevelShutdown
是配置为关闭(而不是重新启动)时所有功能最终达到的功能。因此,弄清楚如何避免此链接错误可能是关键。