You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:50:11