屏幕关闭时停止侦听指纹

时间:2016-01-05 10:28:21

标签: android fingerprint

我的应用程序的用户报告说,当我的应用程序正在侦听指纹身份验证(我已调用fingerprintManager.authenticate)并且屏幕已关闭(通过按设备电源开关按钮)时,无法使用用于解锁设备的指纹。

我还可以看到在屏幕关闭时调用onAuthenticationError回调方法,这在我离开活动时不会发生,因为我在CancellationSignal.cancel()方法中调用了onPause。我已经检查过onPause正在被调用。

在指纹对话框示例中可以观察到相同的行为(https://github.com/xamarin/monodroid-samples/tree/master/android-m/FingerprintDialog,移植自https://github.com/googlesamples/android-FingerprintDialog

我该怎么做才能解决此问题?

编辑:我还尝试为on.Anup.action.CREEN_OFF注册一个广播接收器,它会在onPause之后得到通知,所以在接收器中调用cancel()并没有改变任何东西也就不足为奇了。

3 个答案:

答案 0 :(得分:6)

我的问题与您的问题类似:如果有人通过按Home键将我的应用程序发送到后台,它仍然可以控制指纹传感器,因此没有其他人可以使用它。从活动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的{​​{1}}方法,而 onPause()之前。否则你会收到警告

  

拒绝你的.package.name。 ;不在前台

     

cancelAuthentication():拒绝您的包名

我搜索过Android FingerPrint服务的源代码,我发现了这一行:

super.onPause()

其中canUseFingerprint实际上检查我们是前景还是否(它做的事情之一):

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

这样我们就永远不能从后台调用cancelAuth。并且Android认为我们在调用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 } 之后就处于后台。经过几个小时的研究,我发现的唯一解决方案是交换取消操作和super.onPause():

super.onPause();

在Android M和N上为我工作。希望这有帮助。

答案 1 :(得分:2)

我遇到过与Samsung Fingerprint SDK类似的行为(当屏幕被锁定或关闭时无法进行身份验证,它不是一个错误,它是设计的)。在审核了这种情况之后 - 我们得出结论,最好的方法是为用户创建一个包含PendingIntent的通知,该通知会触发您的应用并启动指纹认证过程。

通知可能会使手机振动/发出哔哔声,以便提醒用户。

希望这有帮助。

答案 2 :(得分:2)

在回调方法onError()中也调用' stopListeningc'。然后,当屏幕关闭时,应用程序中的指纹监听器将停止工作,然后您的设备将收听指纹。

希望这有帮助!