android - sacar - Deja de escuchar la huella dactilar cuando la pantalla está apagada
descargar bloqueo de huella digital para android (3)
Un usuario de mi aplicación informó que cuando mi aplicación está escuchando la autenticación de huellas dactilares (he llamado fingerprintManager.authenticate
) y la pantalla se apaga (presionando el botón de encendido del dispositivo), no es posible usar la huella dactilar para desbloquear la dispositivo.
También puedo ver que el método de devolución de llamada onAuthenticationError se activa cuando la pantalla está apagada, lo que no ocurre cuando onPause
mi actividad, porque llamo a onPause
CancellationSignal.cancel()
en mi método onPause
. He comprobado que se está llamando a onPause
.
El mismo comportamiento se puede observar en el ejemplo del Diálogo de huellas dactilares ( https://github.com/xamarin/monodroid-samples/tree/master/android-m/FingerprintDialog , portado desde https://github.com/googlesamples/android-FingerprintDialog )
¿Qué puedo hacer para resolver este comportamiento?
EDITAR: También intenté registrar un receptor de difusión para android.intent.action.SCREEN_OFF que se notifica después de onPause, por lo que no es sorprendente que llamar a cancel()
en ese receptor no cambie nada.
En el método de devolución de llamada onError () también se llama ''stopListeningc''. Luego, cuando la pantalla se apaga, el detector de huellas dactilares de su aplicación dejará de funcionar, luego su dispositivo escuchará las huellas dactilares.
¡Espero que esto ayude!
Me he encontrado con un comportamiento similar con el Samsung Fingerprint SDK (no se puede autenticar cuando la pantalla está bloqueada o apagada, no es un error, es por diseño). Después de revisar este escenario, hemos llegado a la conclusión de que el mejor enfoque sería crear una notificación para el usuario que contendría un PendingIntent que activaría su aplicación y comenzaría el proceso de autenticación de huellas digitales.
La notificación podría hacer que el teléfono vibre / bip para que el usuario reciba una alerta.
Espero que esto ayude.
Mi problema es similar al tuyo: si alguien envía mi aplicación al fondo presionando el botón Inicio, todavía tiene el control sobre el Sensor de huellas dactilares, de modo que nadie más puede usarlo. Llamar a cancelar desde actividades en Pausa () no funciona:
@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();
}
}
onPause()
llamar al método cancel()
de su onPause()
CancellationSignal
en el método onPause()
su actividad pero antes de super.onPause()
. De lo contrario obtendrá la advertencia.
Rechazando su.paquete.nombre. ; no en primer plano
cancelAuthentication (): rechaza el nombre de tu paquete
He buscado el código fuente del servicio de huellas digitales de Android y he encontrado estas líneas:
public void cancelAuthentication(final IBinder token, String opPackageName) {
if (!canUseFingerprint(opPackageName, false /* foregroundOnly */)) {
return;
}
//we don''t get here
...
...
}
donde canUseFingerprint es en realidad comprueba si estamos en primer plano o no (una de las cosas que hace):
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
}
De esta manera nunca podremos llamar a cancelAuth desde el fondo. Y Android cree que estamos en segundo plano justo después de super.onPause();
se llama. Después de varias horas de investigación, la única solución que he encontrado es intercambiar la acción de cancelación y la 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();
}
Me funcionó en Android M y N. Espero que esto ayude.