web-dev-qa-db-ja.com

生体認証ハードウェアが存在し、ユーザーがAndroid P

生体認証ハードウェアの存在に応じて、特定のUI要素を表示するように求められます。 Android 23-27私はFingerprintManager#isHardwareDetected()FingerprintManager#hasEnrolledFingerprints()を使用します。両方ともAndroid 28。

BiometricPrompt#authenticate(...)を使用し、BiometricPrompt.AuthenticationCallback#onAuthenticationError(int errorCode, ...)メソッドでBiometricPrompt#BIOMETRIC_ERROR_HW_NOT_PRESENTまたはBiometricPrompt#BIOMETRIC_ERROR_NO_BIOMETRICSを受け取ることで、この情報を取得できることを理解しています。しかし、これはBiometricPromptをサポートデバイスに表示することになり、望ましくありません。 CancellationSignalを使用することも、プロンプトをキャンセルするタイミングがわからないため、解決策ではないようです。

生体認証ハードウェアの存在とユーザー登録を検出する方法はありますか?

30
sirius

GoogleはAndroid Qで最終的にこの問題を解決しました

Android.hardware.biometrics.BiometricManager#canAuthenticate() メソッドを使用して、生体認証を使用できるかどうかを判断できます。

このメソッドを使用して、生体認証ハードウェアが存在するかどうか、およびユーザーが登録されているかどうかを判断できます。

ユーザーが登録されていない場合はBIOMETRIC_ERROR_NONE_ENROLLEDを返し、現在サポートまたは有効化されているものがない場合はBIOMETRIC_ERROR_HW_UNAVAILABLEを返します。生体認証を現在使用できる(登録済みで利用可能)場合、BIOMETRIC_SUCCESSを返します。

これがandroidx.biometric:biometricライブラリに追加され、すべてのデバイスで使用できることを願っています。

それまで、@ algridによるソリューションは、生体認証の登録を決定するために機能します。

また、以下を使用して、指紋リーダーが存在するかどうかを判別できます。

Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
            context.packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)
12
sirius

悲しいことに、Googleは関連する問題のステータスを「修正しない(意図した動作)」に変更したため、この問題を解決しませんでした。今のところ、古い非推奨のAPIを使用することを好みます。

ただし、新しいAPIを使用する場合は、hasEnrolledFingerprints()アナログを取得するためのハック//い方法があります(コードはAPI23 +用です)。

public boolean isBiometryAvailable() {
    KeyStore keyStore;
    try {
        keyStore = KeyStore.getInstance("AndroidKeyStore");
    } catch (Exception e) {
        return false;
    }

    KeyGenerator keyGenerator;
    try {
        keyGenerator = KeyGenerator.getInstance(
                KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
    } catch (NoSuchAlgorithmException |
            NoSuchProviderException e) {
        return false;
    }

    if (keyGenerator == null || keyStore == null) {
        return false;
    }

    try {
        keyStore.load(null);
        keyGenerator.init(new
                KeyGenParameterSpec.Builder("dummy_key",
                KeyProperties.PURPOSE_ENCRYPT |
                        KeyProperties.PURPOSE_DECRYPT)
                .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                .setUserAuthenticationRequired(true)
                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
                .build());
    } catch (NoSuchAlgorithmException | InvalidAlgorithmParameterException
            | CertificateException | IOException e) {
        return false;
    }
    return true;

}

これは、次のAndroid keystore docsステートメントに基づいています:

  • ユーザー認証は、1つのキーに関連付けられた特定の暗号化操作を許可します。このモードでは、このようなキーを含む各操作は、ユーザーによって個別に承認される必要があります。現在、このような承認の唯一の手段は指紋認証です:FingerprintManager.authenticate。 このようなキーは、少なくとも1つの指紋が登録されている場合にのみ生成またはインポートできます(FingerprintManager.hasEnrolledFingerprintsを参照)。これらのキーは、新しい指紋が登録されるか、すべての指紋が登録解除されると、永久に無効になります。

こちらの「キーの使用にはユーザー認証が必要」セクションを参照してください https://developer.Android.com/training/articles/keystore

5
algrid

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
}

さらに、あなたはアプリのgradleファイルをdependecyとして実装する必要があります:

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

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

compileSdkVersion 29
buildToolsVersion "29.0.1"
3
markomoreno

AndroidX生体認証ライブラリは、バージョン1.0.0-beta01androidx.biometric:biometric:1.0.0-beta01

BiometricManager.from(context).canAuthenticate()

のいずれかを返します

  • BIOMETRIC_SUCCESS
  • BIOMETRIC_ERROR_HW_UNAVAILABLE
  • BIOMETRIC_ERROR_NONE_ENROLLED
  • BIOMETRIC_ERROR_NO_HARDWARE

changelogを参照してください:https://developer.Android.com/jetpack/androidx/releases/biometric#1.0.0-beta01 =

2
mlyko

メソッド-パッケージマネージャーを使用してデバイスで指紋認証が利用できることを確認する前に、ユーザーがアプリに対して有効な生体認証の許可を持っていることを確認します。さらに、ユーザーが登録されているかどうかもチェックします。

実装 'androidx.biometric:biometric:1.0.0-alpha03'

private Boolean checkBiometricSupport() {

    KeyguardManager keyguardManager =
            (KeyguardManager) getSystemService(KEYGUARD_SERVICE);

    PackageManager packageManager = this.getPackageManager();

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        notifyUser("This Android version does not support fingerprint authentication.");
        return false;
    }

    if(!packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
    {
        notifyUser("Fingerprint Sensor not supported");
        return false;
    }

    if (!keyguardManager.isKeyguardSecure()) {
        notifyUser("Lock screen security not enabled in Settings");

        return false;
    }

    if (ActivityCompat.checkSelfPermission(this,
            Manifest.permission.USE_BIOMETRIC) !=
            PackageManager.PERMISSION_GRANTED) {
        notifyUser("Fingerprint authentication permission not enabled");

        return false;
    }

    return true;
}
0
Twinkle

サポートライブラリのリリースを待ちたくない場合は、このようにナイトリービルドを使用できます。

repositories {
        maven {
            url "https://ci.Android.com/builds/submitted/5795878/androidx_snapshot/latest/repository/"
        }
    }

implementation group: 'androidx.biometric', name: 'biometric', version: '1.0.0-SNAPSHOT'

ここからビルドバージョンを取得する

https://ci.Android.com/builds/branches/aosp-androidx-master-dev/

ブランチaosp-androidx-master-dev

androidx-snapshotから最新のビルドを表示

0
ksc91u

利用可能なクラスメソッドがありますFingerprintManagerCompat.from(this).isHardwareDetectedandroidx.core.hardware.fingerprint パッケージ。

0
CoDe