2011-12-09 7 views
12

Chcę wysłać urządzenie do trybu uśpienia lub wyłączyć ekran. Mam zbadać i znaleźć ten temat: Turn off screen on AndroidJak wyłączyć ekran lub wysłać urządzenie do uśpienia

Zasadniczo są trzy sposoby, aby to zrobić, ale znalazłem problemy dla trzech:

a) Wybór 1:

PowerManager manager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
manager.goToSleep(int amountOfTime); 

Problem : Powoduje FC. Czytałem, że potrzebuję uprawnień DEVICE_POWER, ale nie można go przyznać zwykłym aplikacjom.

b) Wybór 2:

PowerManager manager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag"); 
wl.acquire(); 
wl.release(); 

Problem: ta nie działa dla mnie. Nie wiem dlaczego. Nie daje mi FC, ale jest nieszkodliwy.

c) Wybór 3:

WindowManager.LayoutParams params = getWindow().getAttributes(); 
params.flags |= LayoutParams.FLAG_KEEP_SCREEN_ON; 
params.screenBrightness = 0; 
getWindow().setAttributes(params); 

Problem: mogę zmusić go do pracy, ale podczas próby, aby włączyć urządzenie to nie dziwne rzeczy, jakby nie chciał wrócić, czy moje aplikacje jest z przodu, automatycznie przechodzi w stan uśpienia zaraz po naciśnięciu przycisku. Wygląda to bardziej jak wskazówka lub obejście niż normalne rozwiązanie.

Czy ktoś może mi powiedzieć jakąś dobrą metodę wysłania urządzenia do trybu uśpienia lub wyłączenia ekranu, który może działać bez problemów? Rzadko zdarza mi się, że prosta funkcjonalność, taka jak ta, nie jest dobrym sposobem na jej wykorzystanie (lub co najmniej dobrze udokumentowane).

Odpowiedz

7

Sam odpowiadam. Możliwe jest wyłączenie urządzenia, ale aplikacja musi zaimplementować funkcję administratora urządzenia za pośrednictwem interfejsu API: Device Administration

W tym interfejsie API istnieje funkcja locknow(), która wykonuje to, co chcę.

W każdym razie ma to na celu rozszerzenie sprzętu i zabezpieczeń Androida i jest bardzo mało prawdopodobne, aby ktokolwiek chciał sterować urządzeniem w ten sposób.

To, czego chciałem, to możliwość zablokowania urządzenia z prostego gestu. Ponieważ nie chcę tworzyć własnej klasy menedżera urządzeń, sprawdzam, czy zainstalowana jest bezpłatna aplikacja "lockScreen" i uruchom ją. Jest to skrót i łatwy sposób robienia tego, co chcę. Ta aplikacja musi zostać zarejestrowana jako menedżer urządzeń, więc zaimplementowała tę klasę. Można go uwolnić z rynku.

+0

Co jeśli chcę go wyłączyć ekran i nie zablokować do moich czasów blokady ekranu na zewnątrz? –

0

Moja aplikacja robi to już karę, znalazłem to w moim PowerManager.class

/** 
* Force the device to go to sleep. Overrides all the wake locks that are 
* held. 
* 
* @param time is used to order this correctly with the wake lock calls. 
*   The time should be in the {@link SystemClock#uptimeMillis 
*   SystemClock.uptimeMillis()} time base. 
*/ 
public void goToSleep(long time) 
{ 
    try { 
     mService.goToSleep(time); 
    } catch (RemoteException e) { 
    } 
} 
+0

Czy jesteś pewien, że nie przechwyciłeś implementacji API klasy PowerManager? Nie mogę użyć tej metody, ponieważ nie mogę uzyskać wymaganych uprawnień. –

+1

Co z zezwoleniem "DEVICE_POWER"? –

Powiązane problemy