以编程方式closures设备

我正在编写一个应用程序,该应用程序可以在一个特定的设备模型(运行基于Amlogic的固件的Android机顶盒设备)上运行。 我有两个根的能力,我的应用程序签署了固件证书。

我的应用程序是该设备的主要重点,并能够启动一个完整的关机是有帮助的。

我没有shutdown命令。 我有reboot命令。

reboot -p没有帮助。 它只是在开机时冻结设备。

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

 PowerManager pm = (PowerManager)getSystemService(Service.POWER_SERVICE); pm.goToSleep(SystemClock.uptimeMillis()); 

我接受所有的build议 – 哈克或其他。 Android的版本预计将维持在4.2.2


意图

该命令将导致设备重启。 Intent.ACTION_SHUTDOWN似乎没有做任何事情。 这意图也许只是报告closures,而不是启动一个?

 Intent i = new Intent(Intent.ACTION_REBOOT); i.putExtra("nowait", 1); i.putExtra("interval", 1); i.putExtra("window", 0); sendBroadcast(i); 

我最幸运的是要求通过意图closures:

 Intent i = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN"); i.putExtra("android.intent.extra.KEY_CONFIRM", true); startActivity(i); 

closures线程

这是更接近一点。 绝对有趣。 你能find一个使用它的例子吗?

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

 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); } } 

shutdownbeginShutdownSequence创buildNullPointerException s(你看到为什么?)和rebootOrShutdown由于UnsatisfiedLinkError创build一个InvocationTargetException …它找不到一个本地方法:

java.lang.UnsatisfiedLinkError:未find本地方法:com.android.server.power.PowerManagerService.nativeShutdown :()com.android.server.power.PowerManagerService.nativeShutdown(Native Method)处的com.android.server.power .PowerManagerService.lowLevelShutdown(PowerManagerService.java:2163)at com.android.server.power.ShutdownThread.rebootOrShutdown(ShutdownThread.java:543)at com.android.server.power.ShutdownThread.run(ShutdownThread.java:393)

lowLevelShutdown是所有函数在configuration为closures(而不是重新启动)时最终达到的function。 因此,弄清楚如何避免这种链接错误可能是关键。

Solutions Collecting From Web of "以编程方式closures设备"

就我而言,我不认为有可能closures设备,我想如何。

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

 Intent i = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN"); i.putExtra("android.intent.extra.KEY_CONFIRM", true); startActivity(i); 

这会popup一个对话框closures设备。 这是一个完美的解决scheme,但在我的情况下,使用它会导致设备崩溃。 这可能是我的设备有点特别,其他设备不会有这些限制。

无论如何,我希望我的testing能够帮助别人解决问题。

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

它的作品,只是植根于设备!

它在根植设备上为我工作。 如果你的设备是根植的,那么你可以使用下面的方法

关掉:

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

重新开始:

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

要使用此代码,您需要超级用户! 适用于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); 

并把这个权限放在清单上:

 <uses-permission android:name="android.permission.SHUTDOWN" />