2016-01-05 19 views
17

Un utente della mia app ha segnalato che quando la mia app è in attesa di autenticazione tramite impronta digitale (ho chiamato fingerprintManager.authenticate) e lo schermo è spento (premendo il pulsante di accensione dei dispositivi), non è possibile utilizzare l'impronta digitale per sbloccare il dispositivo.Arresta ascolto per impronta digitale quando lo schermo è spento

Posso anche vedere che il metodo di callback onAuthenticationError viene chiamato quando lo schermo è spento, cosa che non accade quando abbandono la mia attività, perché chiamo CancellationSignal.cancel() nel mio metodo . Ho controllato che venga chiamato il numero .

Lo stesso comportamento può essere osservato nel campione di dialogo Fingerprint (https://github.com/xamarin/monodroid-samples/tree/master/android-m/FingerprintDialog, porting da https://github.com/googlesamples/android-FingerprintDialog)

Cosa posso fare per risolvere il problema?

EDIT: Ho anche provato a registrare un ricevitore broadcast per android.intent.action.SCREEN_OFF che viene notificato dopo onPause, quindi non sorprende che chiamare il numero cancel() in quel ricevitore non cambi nulla.

+0

OnAuthenticationError si verifica prima o dopo il metodo onPause? – Wossname

+1

Ciao Philipp, hai capito il problema? se così fosse, per favore condividi la soluzione, grazie! – Xcihnegn

risposta

2

Ho riscontrato un comportamento simile con Samsung Fingerprint SDK (impossibile autenticare quando lo schermo è bloccato o spento, non è un bug, è di progettazione). Dopo aver esaminato questo scenario, abbiamo concluso che l'approccio migliore sarebbe creare una notifica per l'utente che conterrebbe un PendingIntent che attiverà la tua app e avvierà il processo di autenticazione delle impronte digitali.

La notifica potrebbe far vibrare/emettere un segnale acustico del telefono in modo che l'utente sia avvisato.

Spero che questo aiuti.

+0

Non vedo come questo dovrebbe aiutare nel mio caso. Sto parlando di una situazione in cui ho già iniziato ad autenticarmi, ma l'utente spegne lo schermo. – Philipp

+0

Ho frainteso ciò che hai scritto. buona fortuna a risolvere questo. – FunkSoulBrother

2

Nel metodo di richiamata suError() chiama anche "stopListeningc". Quindi, quando lo schermo si spegne, l'ascoltatore di impronte digitali dalla tua app smetterà di funzionare, quindi il tuo dispositivo ascolterà le impronte digitali.

Spero che questo aiuto!

4

Il mio problema è simile al tuo: se qualcuno invia la mia app allo sfondo premendo il pulsante Home mantiene il controllo su Fingerprint Sensor, quindi nessun altro può usarlo. Chiamata annullare da attività onPause() non funziona:

@Override 
    protected void onPause() { 
      super.onPause(); 
      /** 
      * We are cancelling the Fingerprint Authentication 
      * when application is going to background 
      */ 
      if (fingerprintHelper!=null && fingerprintHelper instanceof AndroidFingerprintHelper){ 
       log.info("canceling AndroidFingerprintHelper dialog"); 
       fingerprintHelper.cancelIdentify(); 
      } 
    } 

è necessario chiamare il metodo della vostra CancellationSignal nel metodo di vostra attività onPause() ma cancel() primasuper.onPause(). Altrimenti riceverai l'avviso

Rifiutare your.package.name.; Non in primo piano

cancelAuthentication(): Rifiuto tuo nome del pacchetto

Ho cercato il codice sorgente di Android FingerPrint servizio e ho trovato queste righe:

public void cancelAuthentication(final IBinder token, String opPackageName) { 
     if (!canUseFingerprint(opPackageName, false /* foregroundOnly */)) { 
      return; 
     } 
    //we don't get here 
    ... 
    ... 
} 

dove canUseFingerprint è in realtà controlla se siamo di primo piano o no (una delle cose che fa):

private boolean canUseFingerprint(String opPackageName, boolean foregroundOnly) { 

     if (foregroundOnly && !isForegroundActivity(uid, pid)) { 
      Slog.v(TAG, "Rejecting " + opPackageName + " ; not in foreground"); 
      return false; 
     } 
     //we don't get here 
} 

Questa wa Non possiamo mai chiamare cancelAuth dallo sfondo. E Android pensa che siamo in background subito dopo la chiamata allo super.onPause();. Dopo diverse ore di ricerca l'unica soluzione che ho trovato è quello di scambiare l'azione annullare e il super.onPause():

@Override 
    protected void onPause() { 
     /** 
     * We are cancelling the Fingerprint Authentication 
     * when application is going to background 
     */ 
     if (fingerprintHelper!=null && fingerprintHelper instanceof AndroidFingerprintHelper){ 
      log.info("canceling AndroidFingerprintHelper dialog"); 
      fingerprintHelper.cancelIdentify(); 
     } 
     super.onPause(); 
    } 

Ha lavorato per me su Android M e N. Spero che questo aiuti.