2014-07-11 106 views
19

我正在编写一个旨在运行于特定设备型号(运行基于Amlogic的固件的Android机顶盒设备)上的应用程序。我有两个root权限,我的应用程序使用固件证书签名。以编程方式关闭设备

我的应用程序是该设备的主要重点,它可以帮助启动完整的关机。

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

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

PowerManager是一步到位,但该设备将进入休眠模式,而不是完全关闭:

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

我向所有人开放的建议 - 哈克或以其他方式。 Android的版本预计保持在4.2.2


意图

此命令将导致设备重新启动。 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 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); 
    } 
} 

shutdownbeginShutdownSequence创建NullPointerException S和rebootOrShutdown创建InvocationTargetException由于UnsatisfiedLinkError ......它找不到本地方法:

java.lang.UnsatisfiedLinkError: Native method not found: com.android.server.power.PowerManagerService.nativeShutdown:()V at com.android.server.power.PowerManagerService.nativeShutdown(Native Method) at 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是当被配置成关闭功能,所有的功能最终达到,(而不是重新启动)。因此,弄清楚如何避免这种链接错误可能是关键。

+0

这帮助你吗? http://stackoverflow.com/questions/10411650/how-to-shutdown-an-android-mobile-programatically – hungr

+0

不。关机命令丢失。重新启动会冻结设备。电源管理器无法实际关闭设备。只有睡眠和重新启动。 – Knossos

+0

请看看Manty的回答和下面的评论,似乎有关机命令。 – hungr

回答

13

在我的情况下,我不认为有可能关闭设备,我想如何。

,我设法让我的目标最接近的使用:

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

这带来了一个对话框,关闭设备。这是一个完美的解决方案,但在我的情况下,使用它会导致设备崩溃。这可能是因为我的设备有点特别,其他设备不会有这些限制。

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

+0

有什么办法可以通过按电源按钮来防止设备关机或重启。另外我需要将设备限制为静音模式。 – rup35h

+1

你应该真的开始一个新的问题。 – Knossos

+0

@ rup35h:你有两个问题。谷歌一点。如果您找不到答案,请发布两个新的Stack Overflow问题。所以你有更好的机会得到赞扬和答案:1.解释你为什么要这些东西。 2.对拼写和语法要非常小心。 – unforgettableid

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

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

4

它适用于我的根植设备。 如果你的设备是植根那么你可以用下面的方法

关机:

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

重启:

相同的代码,只需使用"reboot"代替"reboot -p"

+0

我得到了java.io.IOException:权限被拒绝但我的设备是扎根的,有什么想法? –

3

要使用此代码,您需要超级用户!适用于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" /> 
请问