Jetpack Compose Tapjacking:过滤器接触到模糊 UI

Jetpack Compose Tapjacking: Filter touches on obscured UI

虽然关于 Tapjacking in tradition XML views in Android 防止恶意应用程序与敏感信息交互的大量文档,似乎 none 围绕 Jetpack Compose 的问题。

对于 @Composables 是否有等同于 filterTouchesWhenObscured 的问题,这个问题是否在更基础的层面上得到了解决,或者自定义逻辑是否需要使用 gesture/touch 修饰符来实现?

无法为特定的可组合项指定 filterTouchesWhenObscured,根据 this 维护者的评论,当前未计划:

We won't likely implement it beyond the ComposeView level in the near future.

但是你可以为 ComposableView 做,它用来绘制 Compose 树。例如,如果您在屏幕上显示某个特定视图时将其应用到整个屏幕,您可以这样做:

val composeView = LocalView.current

DisposableEffect(Unit) {
    composeView.filterTouchesWhenObscured = true
    onDispose {
        composeView.filterTouchesWhenObscured = false
    }
}

或者,如果您想将它应用于特定的可组合项,比如只应用于屏幕的一部分,您可以使用这样的包装器:

@Composable
fun ObscuredView(
    content: @Composable () -> Unit,
) {
    AndroidView(
        factory = {
            ComposeView(it).apply {
                filterTouchesWhenObscured = true
            }
        },
        update = {
            it.setContent(content)
        }
    )
}

用法:

ObscuredView {
    Text("this text is Obscured")
}