Подтвердить что ты не робот

Прекратить прослушивание отпечатка пальца при выключенном экране

Пользователь моего приложения сообщил, что когда мое приложение прослушивает аутентификацию по отпечаткам пальцев (я звонил fingerprintManager.authenticate), и экран выключен (нажав кнопку выключателя питания устройства), невозможно использовать отпечаток пальца для разблокировки устройства.

Я также вижу, что метод обратного вызова onAuthenticationError вызывается, когда экран выключен, чего не происходит, когда я оставляю свою активность, потому что я вызываю CancellationSignal.cancel() в моем методе onPause. Я проверил, что вызов onPause вызывается.

Такое же поведение наблюдается в диалоговом диалоговом окне "Отпечаток пальца" (https://github.com/xamarin/monodroid-samples/tree/master/android-m/FingerprintDialog, портирован из https://github.com/googlesamples/android-FingerprintDialog)

Что я могу сделать, чтобы разрешить это поведение?

EDIT: я также попытался зарегистрировать широковещательный приемник для android.intent.action.SCREEN_OFF, который получает уведомление после onPause, поэтому неудивительно, что вызов cancel() в этом получателе ничего не меняет.

4b9b3361

Ответ 1

Моя проблема похожа на вашу: если кто-то отправляет мое приложение на фоновое изображение, нажав кнопку "Домой", он все еще удерживает контроль над датчиком отпечатков пальцев, поэтому никто не может его использовать. Вызов отмены действий onPause() не работает:

    @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();
            } 
    }

Вам нужно вызвать метод cancel() вашего CancellationSignal в вашем действии onPause(), но до super.onPause(). В противном случае вы получите предупреждение

Отклонение your.package.name.; не на переднем плане

cancelAuthentication(): отклонить имя вашего пакета

Я искал исходный код Android FingerPrint Service, и я нашел следующие строки:

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

где canUseFingerprint фактически проверяет, является ли мы передним или нет (одна из вещей, которые он делает):

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
}

Таким образом, мы никогда не можем вызвать cancelAuth из фона. И Android думает, что мы находимся в фоновом режиме сразу после вызова super.onPause();. После нескольких часов исследований единственным решением, которое я нашел, является замена действия cancel и 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();
    }

Работал для меня на Android M и N. Hope, это помогает.

Ответ 2

Я столкнулся с аналогичным поведением с Samsung Fingerprint SDK (не могу аутентифицироваться, когда экран заблокирован или выключен, это не ошибка, это по дизайну). После рассмотрения этого сценария мы пришли к выводу, что наилучшим подходом было бы создать уведомление для пользователя, которое будет содержать PendingIntent, который будет запускать ваше приложение и запустить процесс проверки подлинности отпечатка пальца.

Уведомление может заставить телефон вибрировать/звучать так, чтобы пользователь был предупрежден.

Надеюсь, что это поможет.

Ответ 3

В методе обратного вызова onError() также вызывается "stopListeningc". Затем, когда экран выключится, прослушиватель отпечатков пальцев из вашего приложения перестанет работать, тогда ваше устройство будет прослушивать отпечаток пальца.

Надеюсь на эту помощь!