2013-01-11 10 views
11

Wiem, że to pytanie było zadawane wiele razy, ale nigdy nie było zadowalającej odpowiedzi.Android - Wyłącz ekran bez wchodzenia w tryb StandBy

Mój problem jest następujący:

Mam aktywność, która zapobiega wyłączeniu ekranu dla ustalonej ilości czasu.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

Gdy czas predefiniowane jest skończona I wyświetli komunikat odliczania poinformować użytkownika, że ​​wyświetlacz będzie wyłączyć w ciągu 10 sekund, jeśli on robi nacisnąć „anuluj”.

Udało mi się wyłączyć wyświetlacz, ale telefon zawsze przełącza się w tryb StandBy.

Dla wyłączenia użyłem:

Window mywindow = getWindow(); 

WindowManager.LayoutParams lp = mywindow.getAttributes(); 

lp.screenBrightness = 0.0f; 

mywindow.setAttributes(lp); 

Czy istnieje możliwość, aby całkowicie przyciemnić wyświetlacz bez przechodzenia do trybu Standby (co wstrzymuje aktywność).

Moim celem jest, aby użytkownik mógł dotknąć ekranu, aby ponownie rozjaśnić ekran. Tak więc aktywność musi pozostać w stanie aktywnym.

Podobne pytanie zostało zadane here.

Ponieważ to pytanie ma prawie rok, mam nadzieję, że być może udało się to komuś w międzyczasie.

Dużo pozdrowień

siggy

+0

Czy próbowałeś ['PowerManager'] (http://developer.android.com/reference/android/os/PowerManager.html)? To może pomóc w włączaniu i wyłączaniu ekranu. Chociaż obawiam się, że może to również uniemożliwić twoją aktywność otrzymywania zdarzeń dotykowych. –

+1

Oprócz tego, czy jest to możliwe, czy nie, nie jestem pewien, czy jest to dobry pomysł do wdrożenia. Gdy ekran się wyłącza, użytkownicy oczekują, że jest włączony. Oznacza to, że nie są uruchamiane żadne inne procesy, które potencjalnie mogłyby skrócić żywotność baterii. Ale także, że urządzenie jest zablokowane i kod pin lub coś trzeba wypełnić, aby odblokować. Nie należy obawiać się "wstrzymywania" aplikacji. W rzeczywistości zostanie "zatrzymany", biorąc pod uwagę cykl życia aktywności Androida. Wstrzymanie następuje, gdy na przykład otwierane jest okno dialogowe, a nie wtedy, gdy urządzenie działa w trybie gotowości. –

+0

@Singularity Obecnie gram trochę z 'PowerManager' i' WakeLocks', ale nie mogę osiągnąć dokładnej obsługi, jaką chciałbym jeszcze mieć. – Siggy

Odpowiedz

7

wydaje się, że nie jest możliwe, aby wyłączyć ekran i ponownie po prostu przez dotknięcie ekranu.

Moje nowe podejście teraz:

private WakeLock screenWakeLock; 

PowerManager pm = PowerManager.getSystemService(Context.POWER_SERVICE); 
screenWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
           "screenWakeLock"); 
screenWakeLock.acquire(); 

PARTIAL_WAKE_LOCK utrzymuje funkcjonowanie procesora ale umożliwia wyświetlanie do zamknięcia.

Po naciśnięciu przycisku zasilania lub ekranu głównego wyświetlacz ponownie się włącza, a aktywność staje się ponownie widoczna (bez konieczności "przesuwania do odblokowania" lub do innego).

Nie zapomnij o wydaniu screenWakeLock.

W moim przypadku zrobiłem to w onResume() działalności:

if (screenWakeLock != null) { 
    if(screenWakeLock.isHeld()) 
     screenWakeLock.release(); 
    screenWakeLock = null; 
} 

Może to pomoże ktoś z podobnym problemem w przyszłości.

+1

+1 jednak pamiętać, że blokada wake jest przestarzała dzień API 13 (nadal możesz go używać w wyższej wersji, jeśli podasz minSDK mniejszy niż 13). – ripopenid

+0

W nowszych wersjach API, musisz użyć go w bardziej podobny sposób: 'PowerManager pm = (PowerManager) getBaseContext(). GetSystemService (Context.POWER_SERVICE);' – forresthopkinsa

1

Uwaga: I nie był w stanie pracować z blokada wybudzenia

I zorientowali obejście, które wiąże się ze zmianą SCREEN_OFF_TIMEOUT. Użyj poniższego kodu , aby go uzyskać.

Settings.System.putInt(getContentResolver(), 
          Settings.System.SCREEN_OFF_TIMEOUT, 10); 

Ustawia to 10 milisekund jako timeout dla screen_timeout SYSTEM-WIDE.

Teraz możesz być zaniepokojony zmianami SYSTEM-WIDE spowodowanymi przez to. Aby obejść ten problem, możesz uzyskać domyślny screen_timeout_time i zapisać go w zmiennej, a następnie ustawić SCREEN_OFF_TIMEOUT systemu na finish() swojej aktywności.

przed ustawieniem 10ms jak nasz screen_timeout dostać SCREEN_OFF_TIMEOUT,

int defaultScreenTimeout= android.provider.Settings. 
     System.getInt(getContentResolver(),Settings.System.SCREEN_OFF_TIMEOUT,-1); 

Teraz kiedy skończysz ze swoimi zmianami lub gdy kończy działalność można ustawić SCREEN_OFF_TIMEOUT powrotem.

@Override 
public void finish(){ 
    Settings.System.putInt(getContentResolver(), 
         Settings.System.SCREEN_OFF_TIMEOUT, defaultScreenTimeout); 
super.finish(); 
} 
Powiązane problemy