2014-07-11 13 views
19

Piszę aplikację zaprojektowaną do pracy na jednym modelu urządzenia (urządzenie z systemem Android, na którym działa oprogramowanie oparte na Amlogic). Mam zarówno funkcję root, jak i moją aplikację podpisano za pomocą certyfikatu oprogramowania układowego.Wyłączyć urządzenie programowo

Moja aplikacja jest głównym celem urządzenia i byłoby pomocne, aby móc rozpocząć pełne wyłączenie. Nie mam komendy . Mam polecenie reboot.

reboot -p nie pomaga. Po prostu zamraża urządzenie, pozostając włączone.

PowerManager jest jeden krok lepiej, ale to ustawia urządzenie w tryb uśpienia, a nie całkowitego wyłączenia:

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

Jestem otwarty na wszelkie sugestie - Hacky lub w inny sposób. Wersja Androida ma pozostać w wersji 4.2.2.


Intents

To polecenie spowoduje ponowne uruchomienie urządzenia. Intent.ACTION_SHUTDOWN nie wydaje się nic. Czy ten zamiar może tylko zgłosić zamknięcie, a nie zainicjować?

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

Najbardziej szczęście miałem z tym było poprosić o wyłączenie przez Intencyjny:

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

Shutdown Temat

To jest nieco bliżej. Zdecydowanie interesujące. Czy możesz znaleźć przykład użycia tego?

tej pory mają pochodzić z tego: (? Widzisz dlaczego)

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 i beginShutdownSequence tworzyć NullPointerException S i rebootOrShutdown tworzy InvocationTargetException powodu UnsatisfiedLinkError ... To nie może znaleźć rodem metoda:

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 jest funkcja, że ​​wszystkie funkcje w końcu osiągnąć, gdy skonfigurowany do zamykania (a nie restart). Więc zastanawianie się, jak uniknąć tego błędu połączenia, może być kluczowe.

+0

Pomoże to? http://stackoverflow.com/questions/10411650/how-to-shutdown-an-android-mobile-programatically – hungr

+0

Brak polecenia zamknięcia. Restart powoduje zatrzymanie urządzenia. Menedżer zasilania nie ma możliwości rzeczywistego wyłączenia urządzenia. Tylko spać i restartować. – Knossos

+0

proszę spojrzeć na odpowiedź od Manty i komentarze poniżej, wydaje się, że jest polecenie zamknięcia. – hungr

Odpowiedz

13

W moim przypadku nie sądzę, aby można było wyłączyć urządzenie, tak jak chciałbym.

Najbliżej że udało mi się dostać do mojego celu używał:

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

To sprowadza się okno dialogowe, aby wyłączyć urządzenie. To idealne rozwiązanie, ale w moim przypadku użycie go powoduje awarię urządzenia. Być może moje urządzenie jest nieco wyjątkowe, a inne urządzenia nie będą miały tych ograniczeń.

W każdym razie mam nadzieję, że moje testy pomogą innym w ich zadaniu.

+0

Czy istnieje sposób, aby zapobiec wyłączeniu lub ponownemu uruchomieniu urządzenia przez naciśnięcie przycisku zasilania. Muszę również ograniczyć urządzenie do trybu cichego. – rup35h

+1

Naprawdę powinieneś zacząć nowe pytanie. – Knossos

+0

@ rup35h: Masz dwa pytania. Google trochę. Jeśli nie znajdziesz odpowiedzi, opublikuj dwa nowe pytania dotyczące przepełnienia stosu. Aby mieć większą szansę na zdobycie upvotes i odpowiedzi: 1. Wyjaśnij, dlaczego chcesz te rzeczy. 2. Uważaj na pisownię i gramatykę. – unforgettableid

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

Działa, tylko z urządzeniami zrootowanymi !!

4

To działa dla mnie na urządzeniu zrootowanym. Jeśli urządzenie jest zakorzeniona następnie można użyć poniżej podejścia

Shutdown:

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

Restart:

sam kod, wystarczy użyć "reboot" zamiast "reboot -p".

+0

Mam java.io.IOException: Odmowa uprawnień ale moje urządzenie jest zakorzenione, jakieś pomysły? –

3

Aby korzystać z tego kodu, potrzebujesz użytkownika Super! Działa na 4.0 i nowszych!

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

i umieścić tego uprawnienia na manifeście:

<uses-permission android:name="android.permission.SHUTDOWN" /> 
Powiązane problemy