2014-07-11 23 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" /> 
請問