web-dev-qa-db-ja.com

Androidx生体認証プロンプトでデバイスの生体認証が有効になっているかどうかを確認する

Android BiometricPrompt プロンプトが廃止予定に置き換えられました FingerprintManager 。FingerPrintManagerには2つの関数hasEnrolledFingerprints()isHardwareDetected()があります。デバイスが指紋をサポートしているかどうか、およびユーザーが指紋認証を登録しているかどうかを確認します。

新しいBiometricPromptでは、BiometricPromptをプロンプト表示しないとこれをチェックする機能がないようです。 BiometricPrompt.AuthenticationCallback.onAuthenticationError(これは、デバイスが生体認証をサポートしているかどうか、およびユーザーが生体認証を登録しているかどうかを示すエラーコードで呼び出されます。

そのため、ユーザーから認証を試みた場合にのみ、この情報を取得できます。デバイスがバイオメトリクスをサポートしており、ユーザーがバイオメトリクスを登録しているかどうかを確認するために認証を要求せずに確認する方法はありますか?

6
Stephan

FingerPrintManagerには、フィンガーピント認証のみに関するデータがあるため、hasEnrolledFringers()があります。ただし、BiometricPromptは、顔認証、ファインプリント、アイリスに使用されます。これは一般的なマネージャークラスのようなものです。 GoogleはcanAuthenticateを追加しました。これは、Android Qをサポートしています。ただし、以下のAPIを使用してそれを確認できます。

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
       val hasBiometricFeature :Boolean = context.packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)

とにかく、Googleはそれをandroidxコンポーネントにも追加しましたandroidx.biometric:biometric

implementation 'androidx.biometric:biometric:1.0.0-alpha04'

許可を使用する

<uses-permission Android:name="Android.permission.USE_BIOMETRIC" />

「AuthenticationCallback」

public void onAuthenticationError(int errorCode, CharSequence errString) {}

エラーコードを確認することができます

/**
 * The user does not have any biometrics enrolled.
 */
int BIOMETRIC_ERROR_NO_BIOMETRICS = 11;
2

CompileSdkVersion 29とbuildToolsVersion "29.0.1"を使用している場合。ネイティブチェックメソッドを使用できます。

この関数はKotlin用に作成しました。

 fun checkForBiometrics() : Boolean {
    Log.d(TAG, "checkForBiometrics started")
    var canAuthenticate = true
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (Build.VERSION.SDK_INT < 29) {
            val keyguardManager : KeyguardManager = applicationContext.getSystemService(KEYGUARD_SERVICE) as KeyguardManager
            val packageManager : PackageManager   = applicationContext.packageManager
            if(!packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
                Log.w(TAG, "checkForBiometrics, Fingerprint Sensor not supported")
                canAuthenticate = false
            }
            if (!keyguardManager.isKeyguardSecure) {
                Log.w(TAG, "checkForBiometrics, Lock screen security not enabled in Settings")
                canAuthenticate = false
            }
        } else {
            val biometricManager : BiometricManager = this.getSystemService(BiometricManager::class.Java)
            if(biometricManager.canAuthenticate() != BiometricManager.BIOMETRIC_SUCCESS){
                Log.w(TAG, "checkForBiometrics, biometrics not supported")
                canAuthenticate = false
            }
        }
    }else{
        canAuthenticate = false
    }
    Log.d(TAG, "checkForBiometrics ended, canAuthenticate=$canAuthenticate ")
    return canAuthenticate
}

さらに、dependencyとしてアプリグラドルファイルを実装する必要があります。

implementation 'androidx.biometric:biometric:1.0.0-alpha04'

また、最新のビルドツールを使用します。

compileSdkVersion 29
buildToolsVersion "29.0.1"
2
markomoreno

これは最近、beta01またはbeta02のandroidx oneに追加されました。

0
nAndroid

メソッドがあるBiometricManagerを使用

canAuthenticate()

戻る

BIOMETRIC_ERROR_NONE_ENROLLED if the user does not have any enrolled
BIOMETRIC_ERROR_HW_UNAVAILABLE if none are currently supported/enabled
BIOMETRIC_SUCCESS if a biometric can currently be used (enrolled and available)
BIOMETRIC_ERROR_NO_HARDWARE

公式ドキュメントをチェックしてください https://developer.Android.com/reference/Android/hardware/biometrics/BiometricManager.html

0
shb