如何在ComponentActivity的Jetpack Compose中集成生物识别验证?
在ComponentActivity的Compose中集成生物识别验证(无需Fragment)
完全可以不依赖Fragment实现,ComponentActivity本身就支持BiometricPrompt的调用,核心是直接基于Activity实例构建BiometricPrompt,结合Compose的状态管理来控制验证流程。
步骤1:配置权限
在AndroidManifest.xml中添加生物识别权限:
<!-- Android 9及以下 --> <uses-permission android:name="android.permission.USE_FINGERPRINT" /> <!-- Android 10及以上 --> <uses-permission android:name="android.permission.USE_BIOMETRIC" />
步骤2:封装生物识别工具类
创建一个工具类处理BiometricPrompt的初始化和回调,避免Composable代码冗余:
class BiometricAuthenticator(private val activity: ComponentActivity) { fun startAuthentication( onSuccess: () -> Unit, onError: (errorCode: Int, errorMessage: String) -> Unit, onCancel: () -> Unit ) { val executor = ContextCompat.getMainExecutor(activity) val callback = object : BiometricPrompt.AuthenticationCallback() { override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) { super.onAuthenticationSucceeded(result) onSuccess() } override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { super.onAuthenticationError(errorCode, errString) onError(errorCode, errString.toString()) } override fun onAuthenticationFailed() { super.onAuthenticationFailed() // 指纹不匹配等验证失败场景,可按需处理 } override fun onAuthenticationCanceled() { super.onAuthenticationCanceled() onCancel() } } val promptInfo = BiometricPrompt.PromptInfo.Builder() .setTitle("身份验证") .setSubtitle("请验证指纹以访问内容") .setNegativeButtonText("取消") .build() val biometricPrompt = BiometricPrompt(activity, executor, callback) biometricPrompt.authenticate(promptInfo) } }
步骤3:在Compose中集成验证逻辑
在目标可组合函数中,用remember管理验证状态,未验证时触发生物识别弹窗,验证成功后展示内容:
@Composable fun ProtectedContentScreen(activity: ComponentActivity) { var isAuthenticated by remember { mutableStateOf(false) } val context = LocalContext.current // Android 10+ 权限请求 val permissionState = rememberPermissionState(permission = Manifest.permission.USE_BIOMETRIC) LaunchedEffect(Unit) { permissionState.launchPermissionRequest() } if (!isAuthenticated) { LaunchedEffect(Unit) { val authenticator = BiometricAuthenticator(activity) authenticator.startAuthentication( onSuccess = { isAuthenticated = true }, onError = { _, errorMessage -> Toast.makeText(context, errorMessage, Toast.LENGTH_SHORT).show() }, onCancel = { Toast.makeText(context, "验证已取消", Toast.LENGTH_SHORT).show() } ) } // 验证中显示加载状态 Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { CircularProgressIndicator() } } else { // 验证成功后展示的业务内容 Column(modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center) { Text(text = "已通过验证,欢迎访问!", fontSize = 20.sp) // 其他可组合函数或UI元素 } } }
注意事项
- 提前检查设备支持性:用
BiometricManager.from(context).canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK)判断,根据返回值处理不支持生物识别的场景。 - 权限处理:Android 10及以上必须申请
USE_BIOMETRIC权限,否则弹窗不会触发。 - 状态更新:BiometricPrompt的回调默认在主线程,可直接更新Compose状态无需额外线程切换。
内容的提问来源于stack exchange,提问作者Adev
相关产品推荐
相关产品推荐

