我们目前正在尝试使用生物识别技术对数据进行签名,我们使用 androidx.biometric 库。
问题是,如果没有安装指纹但注册了人脸,我们将无法生成任何密钥。
仅使用指纹或结合指纹和面部,一切都完美无缺。
仅注册了人脸,我们在密钥生成过程中会遇到以下异常:
引起:java.security.InvalidAlgorithmParameterException:java.lang.IllegalStateException:必须至少注册一个生物特征才能创建每次使用都需要用户身份验证的密钥
在我们开始生成密钥之前,我们测试生物识别的存在如下:
boolean isAvailable = biometricManager.canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS;
作为搭载 Android 10 的三星 Galaxy S10 的测试设备。
感谢您的帮助和最好的问候
android biometrics android-keystore keystore-access android-biometric-prompt
我已经在我的应用程序中实现了生物识别级别BIOMETRIC_STRONG (Class 3)的生物识别身份验证。指纹验证按预期工作,但我无法在我的任何设备(三星 Galaxy S10、Oppo A3S 等)上测试面部验证。我认为这些设备中的人脸验证不属于 3 类。
是否有支持BIOMETRIC_STRONG(3 类)人脸身份验证的 Android 设备?如果有人可以提供一份清单,将会很有帮助。
当我从这个developer.android.com 教程中复制以下代码时:
BiometricPrompt.PromptInfo promptInfo =
new BiometricPrompt.PromptInfo.Builder()
.setTitle("Biometric login for my app")
.setSubtitle("Log in using your biometric credential")
.setNegativeButtonText("Cancel")
.build();
Run Code Online (Sandbox Code Playgroud)
无法识别提示信息。
我已经按照教程中之前的所有步骤进行了操作。
我BiometricPrompt在应用程序中使用了Android P(API 28)中的新API。(我实际上是在基于此项目的包装器中使用它,以便它也可以在较旧的设备上运行,但这与问题无关。)这在我测试过的所有设备上都运行良好,除了三星S9和脸部解锁。
即使BiometricPrompt当前的普通Android版本仅实现指纹认证,三星似乎也对其进行了扩展以支持Face Unlock。当我在我的应用中触发生物特征认证时,“底页”会弹出一个脸部图标(而不是所有其他设备上显示的指纹图标),并且在屏幕顶部会出现一些文字,显示“未检测到脸部”。(请注意,此处显示的图标是操作系统提供的,而不是我提供的,因此显然是三星的设计。)
根据文档,BiometricPrompt仅onAuthenticationSucceeded当身份验证成功后,才应关闭自身并调用我的方法。根据logcat,看起来好像已经成功了:
I/IFaceDaemonCallback: BpFaceDaemonCallback onAcquired()
I/SS_3A: INFO: AEC: TsAec_process_get_aec_info: 650: [Id=132] algo_out g=1.785 e_time=0.025 IsLLS=0x0 Ev=7.422 Bv=2.348 ProEv=7.348 Cvgd=1 lux=261, lls=0x0
E/CHI: [SS_ERR ]: [CHI_FACTORY ]: chxseccamerafactoryusecase.cpp: ExecuteCaptureRequest: 452: pMetaData is NULL
I/FaceHal: face_processFrontImage[614398]
I/FaceServiceWrapper: ss_face_processFrontImage(data_len = 614398, width = 480, height = 640, rotation = 270)
I/NativeFaceService: FaceService::processFrontImage - data_len (614398) width(480) height(640) rotation(270) format(2)
I/NativeFaceService: SEC_FR_SERVICE_AUTHENTICATE
I/sec_fr_engine_qsee: sec_fr_engine_on_authenticate_frame
D/sec_fr_engine_qsee: call QSEECom_send_cmd
I/SS_3A: …Run Code Online (Sandbox Code Playgroud) 我正在我的应用程序中实施生物识别技术进行身份验证。我正在使用反应原生生物识别技术。每件事情都很好,只有一个卡住了。Face-id 不适用于 Android。我做了很多谷歌搜索,但无法找到满意的答案。甚至可以在Android中使用face-id吗?
Biometrics.isSensorAvailable()
.then((biometryType) => {
if (biometryType === Biometrics.TouchID) {
console.log('TouchID is supported')
} else if (biometryType === Biometrics.FaceID) {
console.log('FaceID is supported')
} else {
console.log('Biometrics not supported')
}
})
Run Code Online (Sandbox Code Playgroud)
即使我在手机中使用 FaceId,这也总是返回我的 TouchId。提前感谢您的帮助。
一切正常'androidx.biometric:biometric:1.0.0-alpha03',但是当我使用最新版本构建项目'androidx.biometric:biometric:1.0.0-alpha04'并调用myBiometricPrompt.authenticate(promptInfo)它时,会引发此异常:FragmentManager is already executing transactions。
这是堆栈跟踪:
java.lang.IllegalStateException: FragmentManager is already executing transactions
at androidx.fragment.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:2207)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2267)
at androidx.fragment.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:814)
at androidx.biometric.BiometricPrompt.authenticateInternal(BiometricPrompt.java:525)
at androidx.biometric.BiometricPrompt.authenticate(BiometricPrompt.java:465)
at com.my.app.ui.LoginFragment.handleTouchIdAuth(LoginFragment.kt:161)
at com.my.app.ui.LoginFragment.onViewCreated(LoginFragment.kt:62)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1471)
at androidx.fragment.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2646)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2416)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2372)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3273)
at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2466)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1483)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3269)
at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:620)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:178)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1391)
at android.app.Activity.performStart(Activity.java:7157)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2937)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70) …Run Code Online (Sandbox Code Playgroud) 问题
biometricPrompt.authenticate(**crypto**, promptInfo)呼叫提示
。来源参考:
用于测试的设备:
我正在遵循的身份验证步骤:
还有另一种身份验证方法,它采用密码对象来确保
在新旧 API 设备支持下,一切都按预期工作。除非实现其他生物特征认证选项虹膜和使用面部检测的测试应用程序。
如果我遵循
生物识别提示。身份验证(提示信息)然后应用程序简单地根据用户偏好显示身份验证选项,他必须从设备设置 -> 生物识别偏好中进行选择。并独立执行认证。(PFA: 选项A, B )
但是如果使用,biometricPrompt.**authenticate**(crypto, promptInfo)那么它只显示指纹认证选项。对于其他首选项虹膜和面部检测,它不会在authenticate(..)方法调用时显示任何内容。(PFA:选项C)
题
BiometricPrompt 在其构造函数中需要 Fragment 或 FragmentActivity。我无法找到如何从可组合屏幕使用 BiometricPrompt,文档中没有,任何教程中都没有。这里有人处理过同样的问题吗?或者是否有其他方法可以在完全 Compose 构建的应用程序中使用生物识别身份验证?
众所周知,从 android 9.0 开始,android 引入了BiometricPrompt Api,以在越来越多的生物识别传感器(例如指纹、Face ID 等)中提供标准的身份验证体验。
现在有了这个新的 BiometricPrompt Api,用户可以通过指纹、面部扫描仪或虹膜扫描进行身份验证(取决于他们的生物识别偏好)。BiometricPrompt api 会处理这个问题,它会通过各种回调通知我们。
下面是我显示生物识别提示的代码。
biometricPrompt = new BiometricPrompt.Builder(context)
.setTitle("FingerPrint Authentication")
.setSubtitle("Login via Fingerprint")
.setDescription("Touch Fingerprint Sensor")
.setNegativeButton("Cancel", context.getMainExecutor(),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Log.d(TAG,"Cancelled");
}
})
.build();
Run Code Online (Sandbox Code Playgroud)
现在,如果您看到我的代码,我将标题设置为Fingerprint Authentication。现在在设备设置中,如果用户已将生物识别首选项设置为面容 ID而不是指纹,那么此biometricPrompt将通过面容ID对用户进行身份验证,即使用户一直触摸传感器,指纹传感器也不会工作。这会造成混淆,因为生物识别标题说“指纹身份验证”和用户实际上是通过faceID 进行身份验证的
有什么方法可以让我们知道用户选择了什么生物识别偏好(例如指纹或面容 ID)?因此,基于该偏好,我可以在 BiometricPrompt 上显示适当的消息,这样用户就不会感到困惑。
我已经从 BiometricPrompt 探索了所有 api,但可以找到任何与 BiometricPreference 相关的东西。
任何帮助将不胜感激。
android samsung-mobile android-fingerprint-api android-9.0-pie android-biometric-prompt
当使用 setDeviceCredentialAllowed(true) 在应用程序中显示生物识别提示时,按下设备主页按钮时不会取消该提示。它会抛出 BiometricPrompt.ERROR_USER_CANCELED 错误并保持系统 UI 不变。
有人遇到过这个问题吗?有什么解决办法吗?
注意:我正在使用 androidx.biometric:biometric:1.0.1
注意:它是 Android 的 bug。https://issuetracker.google.com/issues/149770989