2010-08-10 9 views
49

Czy istnieje sposób na wykrycie, kiedy użytkownik odblokowuje telefon? Wiem o ACTION_SCREEN_ON i ACTION_SCREEN_OFF, ale te wydają się być zwolniony, gdy ekran włącza/wyłącza się po naciśnięciu przycisku zasilania, ale nie w rzeczywistości, gdy telefon zostanie odblokowany po naciśnięciu przycisku Menu ...Android - wykrywa zdarzenie odblokowania telefonu, a nie ekran

próbuję wykryj odblokowanie/blokadę podczas działania, a ja chcę wznowić działanie po odblokowaniu.

Odpowiedz

1

nie testowałem go ale spróbuj wykonać następujące czynności:

  • Odczekaj ACTION_SCREEN_ON.
  • (Po włączeniu ekranu) Poczekaj na ACTION_MAIN z kategorią CATEGORY_HOME (Która uruchamia ekran główny) - Prawdopodobnie jest to wysyłane po odblokowaniu telefonu.

Pierwszy krok jest potrzebny do odfiltrowania zwykłych naciśnięć klawiszy HOME.

+0

Ale czy to zadziała na wszystkich telefonach? Na przykład w menu myTouch naciśnięcie przycisku Menu odblokowuje telefon, inne telefony wymagają przesuwania się po telefonie. Czy jest coś, co może złapać wszystko? – Chris

+0

Wierzę w to - ACTION_MAIN z kategorią CATEGORY_HOME jest definitywnie wywoływany w celu uruchomienia ekranu głównego (to jest programu uruchamiającego). Istnieje jednak wiele telefonów z systemem Android, więc nie mogę być w 100% pewny.Lepiej spróbuj i zobacz, czy to działa dla ciebie. – adamk

+0

Przypuszczam, że zapomniałem wspomnieć o uruchomieniu działania, a gdy jest ono uruchomione, chcę zablokować/odblokować ekran i wznowić działanie po odblokowaniu. Oczekiwanie na ACTION_MAIN i CATEGORY_HOME po prostu zawiesza moją aktywność podczas odblokowywania. – Chris

61

Oto co należy zrobić:

Powiedzmy, że chcesz, aby wykryć zdarzenie odblokowania i zrobić coś w swojej działalności, gdy telefon jest odblokowany. Odbiornik transmisji dla ACTION_SCREEN_ON, ACTION_SCREEN_OFF i ACTION_USER_PRESENT.

onResume aktywności zostanie wywołana, gdy ACTION_SCREEN_ON zostanie uruchomiony. Utwórz przewodnik i poczekaj na ACTION_USER_PRESENT. Po uruchomieniu zaimplementuj to, co chcesz dla swojej aktywności.

zasługa odpowiedź CommonsWare tu: Android -- What happens when device is unlocked?

+1

jest coś, co można uzyskać wywołania zwrotnego w c/C++, tj. W warstwie macierzystej. – CoDe

17

Po straggling z tym na chwilę, Znalazłem, że najlepszym sposobem, aby to zrobić, to zarejestrować BroadcastReceiver na „android.intent.action.USER_PRESENT " akcja.

"Działanie transmisji: wysłane, gdy użytkownik jest obecny po przebudzeniu urządzenia (np. Po zniknięciu klawisza)."

Aby odróżnić przypadki, w których użytkownik włączył swój ekran, gdy nie był zablokowany, gdy faktycznie został odblokowany, należy użyć KeyguardManager, aby sprawdzić ustawienia zabezpieczeń. Przykładem

Kod:

Dodaj to do swojej aktywności:

registerReceiver(new PhoneUnlockedReceiver(), new IntentFilter("android.intent.action.USER_PRESENT")); 

Następnie użyj tej klasy:

public class PhoneUnlockedReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     KeyguardManager keyguardManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE); 
     if (keyguardManager.isKeyguardSecure()) { 

      //phone was unlocked, do stuff here    

     } 
    } 
} 
+1

Czy nie chcesz sprawdzić 'if (! KeyguardManager.isKeyguardLocked())' i '! IsDeviceSecure()' na urządzeniach SDK 23+? – for3st

+0

To jest trochę źle, jak na https://stackoverflow.com/a/30053876/461982, który mówi, że chcesz sprawdzić 'isDeviceLocked', aby zweryfikować rzeczywisty stan, a nie tylko, czy w ustawieniach została włączona bezpieczna blokada. Możesz także sprawdzić 'KeyKardownięKontaktowyRunkierInputMode' dla API <22 – LoungeKatt

5
public class PhoneUnlockedReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)){ 
      Log.d(TAG, "Phone unlocked"); 
     }else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){ 
      Log.d(TAG, "Phone locked"); 
     } 
    } 
} 

odbiornik zarejestrować tym stwierdzeniem

receiver = new PhoneUnlockedReceiver(); 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_USER_PRESENT); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     registerReceiver(receiver, filter); 
+0

Twój kod nie jest pracą –

+0

Używam tego dorsza i działa dobrze, sprawdź, czy zastosowałeś jakąś blokadę wzoru/pin lub używając aplikacji blokady ekranu innej firmy. Może to przeszkadzać. –