web-dev-qa-db-ja.com

画面がオフのときに指紋のリッスンを停止します

私のアプリのユーザーは、私のアプリが指紋認証をリッスンしていて(私は_fingerprintManager.authenticate_と呼んでいます)、画面がオフになっている(デバイスの電源スイッチボタンを押す)と、指紋を使用できないと報告しましたデバイスのロックを解除します。

また、画面がオフのときにonAuthenticationErrorコールバックメソッドが呼び出されることもわかります。これは、onPauseメソッドでCancellationSignal.cancel()を呼び出すため、アクティビティを終了するときには発生しません。 onPauseが呼び出されていることを確認しました。

指紋ダイアログのサンプル( https://github.com/xamarin/monodroid-samples/tree/master/Android-m/FingerprintDialog 、移植元 https ://github.com/googlesamples/Android-FingerprintDialog

この動作を解決するにはどうすればよいですか?

編集:onPauseの後に通知されるAndroid.intent.action.SCREEN_OFFのブロードキャストレシーバーも登録しようとしたので、そのレシーバーでcancel()を呼び出しても何も変わらないのは当然です。

18
Philipp

私の問題はあなたの問題と似ています。誰かがホームボタンを押してアプリをバックグラウンドに送信した場合でも、指紋センサーを制御できるため、他の誰もそれを使用できません。 onPause()のアクティビティからcancelを呼び出すことが機能していません:

_    @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()メソッドでCancellationSignalonPause()メソッドを呼び出す必要がありますが、beforesuper.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は、実際にフォアグラウンドであるかどうかをチェックします(実行することの1つ)。

_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();が呼び出された直後にバックグラウンドにいると考えています。数時間の調査の後、私が見つけた唯一の解決策は、キャンセルアクションと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で働いてくれました。これがお役に立てば幸いです。

6

Samsung Fingerprint SDKで同様の動作が発生しました(画面がロックまたはオフになっていると認証できません。バグではなく、仕様によるものです)。このシナリオを確認した後、最善のアプローチは、アプリをトリガーして指紋認証プロセスを開始するPendingIntentを含むユーザーへの通知を作成することであると結論付けました。

通知により、電話が振動/ビープ音を鳴らして、ユーザーに警告が発せられる可能性があります。

お役に立てれば。

2
FunkSoulBrother

コールバックメソッドonError()では、「stopListeningc」も呼び出します。次に、画面がオフになると、アプリの指紋リスナーが機能を停止し、デバイスが指紋をリッスンします。

この助けを願っています!

2
Xcihnegn