使用Jetpack Compose的生物识别提示。

8

BiometricPrompt的构造函数要求使用Fragment或FragmentActivity。我无法找到如何在可组合屏幕中使用BiometricPrompt的方法,无论是在文档中还是在任何教程中都没有。有没有人遇到过同样的问题?或者有没有其他方法可以在完全由Compose构建的应用程序中使用生物识别身份验证?

5个回答

7

请查看此博客文章:https://fvilarino.medium.com/adding-a-pin-screen-with-biometric-authentication-in-jetpack-compose-a9bf7bd8acc9 - Francesc
无法工作,我得到了一个异常:java.lang.ClassCastException: com.example.testapp.MainActivity 无法转换为 androidx.fragment.app.FragmentActivity。 - Stefan
1
@Hassa 正如第一句话所说,您需要将 MainActivityFragmentActivity 进行子类化。 - Phil Dukhov

2

对于那些无法更改其活动基类的人,可以访问issuetracker.google.com/issues/178855209请求一个biometric-compose工件。不幸的是,截至版本1.2.0-alpha04,还没有任何进展。


1

好的,最终还是比较简单的,但我花了几个小时,所以这里是答案,供那些遇到困难的人参考。

确保你的MainActivity从FragmentActivity()继承。然后你就可以将LocalContext.current转换为FragmentActivity。

val context = LocalContext.current as FragmentActivity
val biometricPrompt = BiometricPrompt(
    context,
    authenticationCallback
)

1
你可以继承自AppCompatActivity,它继承自FragmentActivity,后者继承自ComponentActivity。
然后你可以这样做:
inline fun <reified Activity : FragmentActivity> Context.getActivity(): Activity? {
return when (this) {
    is Activity -> this
    else -> {
        var context = this
        while (context is ContextWrapper) {
            context = context.baseContext
                if (context is Activity) return context
            }
            null
        }
    }
}

然后:

val activity = LocalContext.current.getActivity<MainActivity>()

val biometricPrompt = BiometricPrompt(
    activity,
    authenticationCallback
)

1

ComponetActivity()替换为FragmentActivity(),然后从FragmentActivity()中使用普通的Compose视图。

 setContent {
            FingerPrintAppTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background
                ) {
                    Greeting("Android")
                }
            }
        }

然后一切都正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接