یکی از روش های محافظت از اطلاعات حساس یا محتوای ممتاز در برنامه شما درخواست احراز هویت بیومتریک است، مانند استفاده از تشخیص چهره یا تشخیص اثر انگشت. این راهنما نحوه پشتیبانی از جریانهای ورود بیومتریک در برنامه را توضیح میدهد.
به عنوان یک قاعده کلی، باید از Credential Manager برای ورود به سیستم اولیه در دستگاه استفاده کنید. مجوزهای مجدد بعدی را می توان با Biometric Prompt یا Credential Manager انجام داد. مزیت استفاده از Biometric Prompt این است که گزینه های سفارشی سازی بیشتری را ارائه می دهد، در حالی که Credential Manager یک پیاده سازی واحد را در هر دو جریان ارائه می دهد.
انواع احراز هویتی که برنامه شما پشتیبانی می کند را اعلام کنید
برای تعریف انواع احراز هویتی که برنامه شما پشتیبانی می کند، از رابط BiometricManager.Authenticators
استفاده کنید. این سیستم به شما امکان می دهد تا انواع احراز هویت زیر را اعلام کنید:
-
BIOMETRIC_STRONG
- احراز هویت با استفاده از بیومتریک کلاس 3 ، همانطور که در صفحه تعریف سازگاری Android تعریف شده است.
-
BIOMETRIC_WEAK
- احراز هویت با استفاده از بیومتریک کلاس 2 ، همانطور که در صفحه تعریف سازگاری Android تعریف شده است.
-
DEVICE_CREDENTIAL
- احراز هویت با استفاده از اعتبار قفل صفحه - پین، الگو، یا رمز عبور کاربر.
برای شروع استفاده از احراز هویت، کاربر باید یک پین، الگو یا رمز عبور ایجاد کند. اگر کاربر قبلاً یکی نداشته باشد، جریان ثبت نام بیومتریک از او می خواهد که یکی را ایجاد کند.
برای تعریف انواع احراز هویت بیومتریک که برنامه شما میپذیرد، یک نوع احراز هویت یا ترکیبی از انواع را به روش setAllowedAuthenticators()
ارسال کنید. قطعه کد زیر نحوه پشتیبانی از احراز هویت را با استفاده از اعتبار بیومتریک کلاس 3 یا قفل صفحه نشان می دهد.
کاتلین
// Lets the user authenticate using either a Class 3 biometric or // their lock screen credential (PIN, pattern, or password). promptInfo = BiometricPrompt.PromptInfo.Builder() .setTitle("Biometric login for my app") .setSubtitle("Log in using your biometric credential") .setAllowedAuthenticators(BIOMETRIC_STRONG or DEVICE_CREDENTIAL) .build()
جاوا
// Lets user authenticate using either a Class 3 biometric or // their lock screen credential (PIN, pattern, or password). promptInfo = new BiometricPrompt.PromptInfo.Builder() .setTitle("Biometric login for my app") .setSubtitle("Log in using your biometric credential") .setAllowedAuthenticators(BIOMETRIC_STRONG | DEVICE_CREDENTIAL) .build();
ترکیبهای زیر از انواع احراز هویت در Android 10 (سطح API 29) و پایینتر پشتیبانی نمیشوند: DEVICE_CREDENTIAL
و BIOMETRIC_STRONG | DEVICE_CREDENTIAL
. برای بررسی وجود پین، الگو یا رمز عبور در اندروید 10 و پایینتر، از متد KeyguardManager.isDeviceSecure()
استفاده کنید.
بررسی کنید که احراز هویت بیومتریک موجود باشد
پس از اینکه تصمیم گرفتید برنامه شما از کدام عناصر احراز هویت پشتیبانی می کند، بررسی کنید که آیا این عناصر در دسترس هستند یا خیر. برای انجام این کار، همان ترکیب بیتی از انواعی که با استفاده از متد setAllowedAuthenticators()
اعلام کردید را به متد canAuthenticate()
منتقل کنید. در صورت لزوم، اقدام قصد ACTION_BIOMETRIC_ENROLL
را فراخوانی کنید. در intent extra، مجموعه ای از احراز هویت را که برنامه شما می پذیرد ارائه دهید. این هدف از کاربر میخواهد اعتبارنامهای را برای احراز هویتی که برنامه شما میپذیرد، ثبت کند.
کاتلین
val biometricManager = BiometricManager.from(this) when (biometricManager.canAuthenticate(BIOMETRIC_STRONG or DEVICE_CREDENTIAL)) { BiometricManager.BIOMETRIC_SUCCESS -> Log.d("MY_APP_TAG", "App can authenticate using biometrics.") BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE -> Log.e("MY_APP_TAG", "No biometric features available on this device.") BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE -> Log.e("MY_APP_TAG", "Biometric features are currently unavailable.") BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> { // Prompts the user to create credentials that your app accepts. val enrollIntent = Intent(Settings.ACTION_BIOMETRIC_ENROLL).apply { putExtra(Settings.EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED, BIOMETRIC_STRONG or DEVICE_CREDENTIAL) } startActivityForResult(enrollIntent, REQUEST_CODE) } }
جاوا
BiometricManager biometricManager = BiometricManager.from(this); switch (biometricManager.canAuthenticate(BIOMETRIC_STRONG | DEVICE_CREDENTIAL)) { case BiometricManager.BIOMETRIC_SUCCESS: Log.d("MY_APP_TAG", "App can authenticate using biometrics."); break; case BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE: Log.e("MY_APP_TAG", "No biometric features available on this device."); break; case BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE: Log.e("MY_APP_TAG", "Biometric features are currently unavailable."); break; case BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED: // Prompts the user to create credentials that your app accepts. final Intent enrollIntent = new Intent(Settings.ACTION_BIOMETRIC_ENROLL); enrollIntent.putExtra(Settings.EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED, BIOMETRIC_STRONG | DEVICE_CREDENTIAL); startActivityForResult(enrollIntent, REQUEST_CODE); break; }
نحوه احراز هویت کاربر را مشخص کنید
پس از احراز هویت کاربر، می توانید با فراخوانی getAuthenticationType()
بررسی کنید که آیا کاربر با استفاده از اعتبار دستگاه یا اعتبار بیومتریک احراز هویت کرده است.
نمایش درخواست ورود
برای نمایش اعلان سیستمی که از کاربر می خواهد با استفاده از اعتبار بیومتریک احراز هویت کند، از کتابخانه بیومتریک استفاده کنید. این گفتگوی ارائهشده توسط سیستم در بین برنامههایی که از آن استفاده میکنند سازگار است و تجربه کاربری قابلاعتمادتری ایجاد میکند. یک نمونه گفتگو در شکل 1 ظاهر می شود.
برای افزودن احراز هویت بیومتریک به برنامه خود با استفاده از کتابخانه بیومتریک، مراحل زیر را انجام دهید:
در فایل
build.gradle
ماژول برنامه خود، یک وابستگی به کتابخانهandroidx.biometric
اضافه کنید .در فعالیت یا قطعه ای که میزبان گفتگوی ورود بیومتریک است، گفتگو را با استفاده از منطق نشان داده شده در قطعه کد زیر نمایش دهید:
کاتلین
private lateinit var executor: Executor private lateinit var biometricPrompt: BiometricPrompt private lateinit var promptInfo: BiometricPrompt.PromptInfo override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) executor = ContextCompat.getMainExecutor(this) biometricPrompt = BiometricPrompt(this, executor, object : BiometricPrompt.AuthenticationCallback() { override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { super.onAuthenticationError(errorCode, errString) Toast.makeText(applicationContext, "Authentication error: $errString", Toast.LENGTH_SHORT) .show() } override fun onAuthenticationSucceeded( result: BiometricPrompt.AuthenticationResult) { super.onAuthenticationSucceeded(result) Toast.makeText(applicationContext, "Authentication succeeded!", Toast.LENGTH_SHORT) .show() } override fun onAuthenticationFailed() { super.onAuthenticationFailed() Toast.makeText(applicationContext, "Authentication failed", Toast.LENGTH_SHORT) .show() } }) promptInfo = BiometricPrompt.PromptInfo.Builder() .setTitle("Biometric login for my app") .setSubtitle("Log in using your biometric credential") .setNegativeButtonText("Use account password") .build() // Prompt appears when user clicks "Log in". // Consider integrating with the keystore to unlock cryptographic operations, // if needed by your app. val biometricLoginButton = findViewById<Button>(R.id.biometric_login) biometricLoginButton.setOnClickListener { biometricPrompt.authenticate(promptInfo) } }
جاوا
private Executor executor; private BiometricPrompt biometricPrompt; private BiometricPrompt.PromptInfo promptInfo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); executor = ContextCompat.getMainExecutor(this); biometricPrompt = new BiometricPrompt(MainActivity.this, executor, new BiometricPrompt.AuthenticationCallback() { @Override public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) { super.onAuthenticationError(errorCode, errString); Toast.makeText(getApplicationContext(), "Authentication error: " + errString, Toast.LENGTH_SHORT) .show(); } @Override public void onAuthenticationSucceeded( @NonNull BiometricPrompt.AuthenticationResult result) { super.onAuthenticationSucceeded(result); Toast.makeText(getApplicationContext(), "Authentication succeeded!", Toast.LENGTH_SHORT).show(); } @Override public void onAuthenticationFailed() { super.onAuthenticationFailed(); Toast.makeText(getApplicationContext(), "Authentication failed", Toast.LENGTH_SHORT) .show(); } }); promptInfo = new BiometricPrompt.PromptInfo.Builder() .setTitle("Biometric login for my app") .setSubtitle("Log in using your biometric credential") .setNegativeButtonText("Use account password") .build(); // Prompt appears when user clicks "Log in". // Consider integrating with the keystore to unlock cryptographic operations, // if needed by your app. Button biometricLoginButton = findViewById(R.id.biometric_login); biometricLoginButton.setOnClickListener(view -> { biometricPrompt.authenticate(promptInfo); }); }
از یک راه حل رمزنگاری که به احراز هویت بستگی دارد استفاده کنید
برای محافظت بیشتر از اطلاعات حساس در برنامه خود، می توانید با استفاده از نمونه ای از CryptoObject
، رمزنگاری را در گردش کار احراز هویت بیومتریک خود بگنجانید. این چارچوب از اشیاء رمزنگاری زیر پشتیبانی می کند: Signature
، Cipher
و Mac
.
پس از اینکه کاربر با استفاده از یک اعلان بیومتریک با موفقیت احراز هویت کرد، برنامه شما میتواند عملیات رمزنگاری را انجام دهد. به عنوان مثال، اگر با استفاده از یک شی Cipher
احراز هویت میکنید، برنامه شما میتواند رمزگذاری و رمزگشایی را با استفاده از یک شی SecretKey
انجام دهد.
بخشهای زیر نمونههایی از استفاده از یک شی Cipher
و یک شی SecretKey
برای رمزگذاری دادهها را بررسی میکنند. هر مثال از روش های زیر استفاده می کند:
کاتلین
private fun generateSecretKey(keyGenParameterSpec: KeyGenParameterSpec) { val keyGenerator = KeyGenerator.getInstance( KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore") keyGenerator.init(keyGenParameterSpec) keyGenerator.generateKey() } private fun getSecretKey(): SecretKey { val keyStore = KeyStore.getInstance("AndroidKeyStore") // Before the keystore can be accessed, it must be loaded. keyStore.load(null) return keyStore.getKey(KEY_NAME, null) as SecretKey } private fun getCipher(): Cipher { return Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7) }
جاوا
private void generateSecretKey(KeyGenParameterSpec keyGenParameterSpec) { KeyGenerator keyGenerator = KeyGenerator.getInstance( KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); keyGenerator.init(keyGenParameterSpec); keyGenerator.generateKey(); } private SecretKey getSecretKey() { KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); // Before the keystore can be accessed, it must be loaded. keyStore.load(null); return ((SecretKey)keyStore.getKey(KEY_NAME, null)); } private Cipher getCipher() { return Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7); }
فقط با استفاده از اعتبار بیومتریک احراز هویت کنید
اگر برنامه شما از یک کلید مخفی استفاده می کند که برای باز کردن قفل آن به اعتبارنامه های بیومتریک نیاز دارد، کاربر باید هر بار قبل از اینکه برنامه شما به کلید دسترسی پیدا کند، اعتبار بیومتریک خود را تأیید کند.
برای رمزگذاری اطلاعات حساس تنها پس از احراز هویت کاربر با استفاده از اعتبار بیومتریک، مراحل زیر را انجام دهید:
کلیدی را ایجاد کنید که از پیکربندی
KeyGenParameterSpec
زیر استفاده کند:کاتلین
generateSecretKey(KeyGenParameterSpec.Builder( KEY_NAME, KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT) .setBlockModes(KeyProperties.BLOCK_MODE_CBC) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) .setUserAuthenticationRequired(true) // Invalidate the keys if the user has registered a new biometric // credential, such as a new fingerprint. Can call this method only // on Android 7.0 (API level 24) or higher. The variable // "invalidatedByBiometricEnrollment" is true by default. .setInvalidatedByBiometricEnrollment(true) .build())
جاوا
generateSecretKey(new KeyGenParameterSpec.Builder( KEY_NAME, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) .setBlockModes(KeyProperties.BLOCK_MODE_CBC) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) .setUserAuthenticationRequired(true) // Invalidate the keys if the user has registered a new biometric // credential, such as a new fingerprint. Can call this method only // on Android 7.0 (API level 24) or higher. The variable // "invalidatedByBiometricEnrollment" is true by default. .setInvalidatedByBiometricEnrollment(true) .build());
یک گردش کار احراز هویت بیومتریک را شروع کنید که شامل یک رمز است:
کاتلین
biometricLoginButton.setOnClickListener { // Exceptions are unhandled within this snippet. val cipher = getCipher() val secretKey = getSecretKey() cipher.init(Cipher.ENCRYPT_MODE, secretKey) biometricPrompt.authenticate(promptInfo, BiometricPrompt.CryptoObject(cipher)) }
جاوا
biometricLoginButton.setOnClickListener(view -> { // Exceptions are unhandled within this snippet. Cipher cipher = getCipher(); SecretKey secretKey = getSecretKey(); cipher.init(Cipher.ENCRYPT_MODE, secretKey); biometricPrompt.authenticate(promptInfo, new BiometricPrompt.CryptoObject(cipher)); });
در تماسهای احراز هویت بیومتریک خود، از کلید مخفی برای رمزگذاری اطلاعات حساس استفاده کنید:
کاتلین
override fun onAuthenticationSucceeded( result: BiometricPrompt.AuthenticationResult) { val encryptedInfo: ByteArray = result.cryptoObject.cipher?.doFinal( // plaintext-string text is whatever data the developer would like // to encrypt. It happens to be plain-text in this example, but it // can be anything plaintext-string.toByteArray(Charset.defaultCharset()) ) Log.d("MY_APP_TAG", "Encrypted information: " + Arrays.toString(encryptedInfo)) }
جاوا
@Override public void onAuthenticationSucceeded( @NonNull BiometricPrompt.AuthenticationResult result) { // NullPointerException is unhandled; use Objects.requireNonNull(). byte[] encryptedInfo = result.getCryptoObject().getCipher().doFinal( // plaintext-string text is whatever data the developer would like // to encrypt. It happens to be plain-text in this example, but it // can be anything plaintext-string.getBytes(Charset.defaultCharset())); Log.d("MY_APP_TAG", "Encrypted information: " + Arrays.toString(encryptedInfo)); }
با استفاده از مشخصات بیومتریک یا قفل صفحه احراز هویت
می توانید از یک کلید مخفی استفاده کنید که امکان احراز هویت را با استفاده از اعتبارنامه های بیومتریک یا اعتبار صفحه قفل (پین، الگو یا رمز عبور) فراهم می کند. هنگام پیکربندی این کلید، یک دوره زمانی اعتبار را مشخص کنید. در طول این بازه زمانی، برنامه شما میتواند چندین عملیات رمزنگاری را بدون نیاز به احراز هویت مجدد کاربر انجام دهد.
برای رمزگذاری اطلاعات حساس پس از احراز هویت کاربر با استفاده از اطلاعات بیومتریک یا صفحه قفل، مراحل زیر را انجام دهید:
کلیدی را ایجاد کنید که از پیکربندی
KeyGenParameterSpec
زیر استفاده کند:کاتلین
generateSecretKey(KeyGenParameterSpec.Builder( KEY_NAME, KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT) .setBlockModes(KeyProperties.BLOCK_MODE_CBC) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) .setUserAuthenticationRequired(true) .setUserAuthenticationParameters(VALIDITY_DURATION_SECONDS, ALLOWED_AUTHENTICATORS) .build())
جاوا
generateSecretKey(new KeyGenParameterSpec.Builder( KEY_NAME, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) .setBlockModes(KeyProperties.BLOCK_MODE_CBC) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) .setUserAuthenticationRequired(true) .setUserAuthenticationParameters(VALIDITY_DURATION_SECONDS, ALLOWED_AUTHENTICATORS) .build());
در یک دوره زمانی
VALIDITY_DURATION_SECONDS
پس از احراز هویت کاربر، اطلاعات حساس را رمزگذاری کنید:کاتلین
private fun encryptSecretInformation() { // Exceptions are unhandled for getCipher() and getSecretKey(). val cipher = getCipher() val secretKey = getSecretKey() try { cipher.init(Cipher.ENCRYPT_MODE, secretKey) val encryptedInfo: ByteArray = cipher.doFinal( // plaintext-string text is whatever data the developer would // like to encrypt. It happens to be plain-text in this example, // but it can be anything plaintext-string.toByteArray(Charset.defaultCharset())) Log.d("MY_APP_TAG", "Encrypted information: " + Arrays.toString(encryptedInfo)) } catch (e: InvalidKeyException) { Log.e("MY_APP_TAG", "Key is invalid.") } catch (e: UserNotAuthenticatedException) { Log.d("MY_APP_TAG", "The key's validity timed out.") biometricPrompt.authenticate(promptInfo) }
جاوا
private void encryptSecretInformation() { // Exceptions are unhandled for getCipher() and getSecretKey(). Cipher cipher = getCipher(); SecretKey secretKey = getSecretKey(); try { // NullPointerException is unhandled; use Objects.requireNonNull(). ciper.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedInfo = cipher.doFinal( // plaintext-string text is whatever data the developer would // like to encrypt. It happens to be plain-text in this example, // but it can be anything plaintext-string.getBytes(Charset.defaultCharset())); } catch (InvalidKeyException e) { Log.e("MY_APP_TAG", "Key is invalid."); } catch (UserNotAuthenticatedException e) { Log.d("MY_APP_TAG", "The key's validity timed out."); biometricPrompt.authenticate(promptInfo); } }
با استفاده از کلیدهای احراز هویت به ازای هر استفاده احراز هویت کنید
میتوانید از کلیدهای تأیید به ازای استفاده در نمونه BiometricPrompt
پشتیبانی کنید. چنین کلیدی از کاربر میخواهد هر بار که برنامه شما برای دسترسی به دادههایی که توسط آن کلید محافظت میشوند، یک اعتبار بیومتریک یا یک اعتبار دستگاه ارائه کند. کلیدهای Auth-per-use میتوانند برای تراکنشهای با ارزش بالا، مانند پرداخت زیاد یا بهروزرسانی سوابق سلامتی افراد مفید باشند.
برای مرتبط کردن یک شی BiometricPrompt
با یک کلید تأیید اعتبار برای هر استفاده، کدی شبیه به زیر اضافه کنید:
کاتلین
val authPerOpKeyGenParameterSpec = KeyGenParameterSpec.Builder("myKeystoreAlias", key-purpose) // Accept either a biometric credential or a device credential. // To accept only one type of credential, include only that type as the // second argument. .setUserAuthenticationParameters(0 /* duration */, KeyProperties.AUTH_BIOMETRIC_STRONG or KeyProperties.AUTH_DEVICE_CREDENTIAL) .build()
جاوا
KeyGenParameterSpec authPerOpKeyGenParameterSpec = new KeyGenParameterSpec.Builder("myKeystoreAlias", key-purpose) // Accept either a biometric credential or a device credential. // To accept only one type of credential, include only that type as the // second argument. .setUserAuthenticationParameters(0 /* duration */, KeyProperties.AUTH_BIOMETRIC_STRONG | KeyProperties.AUTH_DEVICE_CREDENTIAL) .build();
بدون اقدام کاربر صریح احراز هویت
بهطور پیشفرض، سیستم از کاربران میخواهد تا پس از پذیرفته شدن اعتبار بیومتریک، اقدام خاصی مانند فشار دادن یک دکمه را انجام دهند. اگر برنامه شما کادر گفتگو را برای تأیید یک اقدام حساس یا پرخطر، مانند خرید، نشان میدهد، این پیکربندی ترجیح داده میشود.
با این حال، اگر برنامه شما یک گفتگوی احراز هویت بیومتریک را برای یک اقدام کمخطر نشان میدهد، میتوانید به سیستم اشاره کنید که کاربر نیازی به تأیید احراز هویت ندارد. این راهنمایی میتواند به کاربر اجازه دهد پس از احراز هویت مجدد با استفاده از یک روش غیرفعال، مانند تشخیص مبتنی بر چهره یا عنبیه، محتوای برنامه شما را سریعتر مشاهده کند. برای ارائه این راهنمایی، false
به متد setConfirmationRequired()
ارسال کنید.
شکل 2 دو نسخه از یک گفتگو را نشان می دهد. یک نسخه به یک اقدام کاربر صریح نیاز دارد و نسخه دیگر نیازی ندارد.
قطعه کد زیر نشان میدهد که چگونه میتوان گفتگویی را ارائه کرد که برای تکمیل فرآیند احراز هویت نیازی به عملکرد واضح کاربر ندارد :
کاتلین
// Lets the user authenticate without performing an action, such as pressing a // button, after their biometric credential is accepted. promptInfo = BiometricPrompt.PromptInfo.Builder() .setTitle("Biometric login for my app") .setSubtitle("Log in using your biometric credential") .setNegativeButtonText("Use account password") .setConfirmationRequired(false) .build()
جاوا
// Lets the user authenticate without performing an action, such as pressing a // button, after their biometric credential is accepted. promptInfo = new BiometricPrompt.PromptInfo.Builder() .setTitle("Biometric login for my app") .setSubtitle("Log in using your biometric credential") .setNegativeButtonText("Use account password") .setConfirmationRequired(false) .build();
امکان بازگشت به اعتبارنامه های غیر بیومتریک را فراهم کنید
اگر میخواهید برنامهتان اجازه احراز هویت را با استفاده از اعتبار بیومتریک یا دستگاه بدهد، میتوانید با گنجاندن DEVICE_CREDENTIAL
در مجموعه مقادیری که به setAllowedAuthenticators()
منتقل میکنید، اعلام کنید که برنامه شما از اعتبار دستگاه پشتیبانی میکند .
اگر برنامه شما در حال حاضر از createConfirmDeviceCredentialIntent()
یا setDeviceCredentialAllowed()
برای ارائه این قابلیت استفاده می کند، به استفاده از setAllowedAuthenticators()
بروید.
منابع اضافی
برای کسب اطلاعات بیشتر در مورد احراز هویت بیومتریک در اندروید، به منابع زیر مراجعه کنید.