生体認証ハードウェアの存在に応じて、特定の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
を使用することも、プロンプトをキャンセルするタイミングがわからないため、解決策ではないようです。
生体認証ハードウェアの存在とユーザー登録を検出する方法はありますか?
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)
悲しいことに、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
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"
AndroidX生体認証ライブラリは、バージョン1.0.0-beta01
(androidx.biometric:biometric:1.0.0-beta01
)
BiometricManager.from(context).canAuthenticate()
のいずれかを返します
changelogを参照してください:https://developer.Android.com/jetpack/androidx/releases/biometric#1.0.0-beta01 =
メソッド-パッケージマネージャーを使用してデバイスで指紋認証が利用できることを確認する前に、ユーザーがアプリに対して有効な生体認証の許可を持っていることを確認します。さらに、ユーザーが登録されているかどうかもチェックします。
実装 '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;
}
サポートライブラリのリリースを待ちたくない場合は、このようにナイトリービルドを使用できます。
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から最新のビルドを表示
利用可能なクラスメソッドがありますFingerprintManagerCompat.from(this).isHardwareDetected
androidx.core.hardware.fingerprint
パッケージ。