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

如何在Compose单Activity应用指定页面设置LayoutParams.FLAG_SECURE防截图?

单Activity Compose应用中单个页面禁用截图的解决方案

要在单Activity的Compose应用里仅对指定页面禁用截图,无需新增Activity,可利用Compose的副作用API动态控制窗口的FLAG_SECURE属性,具体实现如下:

核心思路

通过Compose的DisposableEffect,在目标页面进入时为窗口添加FLAG_SECURE,页面销毁/退出时移除该标记,确保仅当前页面生效。

具体实现代码

目标页面的Composable实现

@Composable
fun SecureScreen() {
    // 获取当前Activity的窗口实例
    val activity = LocalContext.current as AppCompatActivity
    val window = activity.window

    // 利用DisposableEffect处理页面生命周期的副作用
    DisposableEffect(Unit) {
        // 保存原始窗口标记,避免移除时影响其他已有标记
        val originalWindowFlags = window.attributes.flags
        
        // 进入页面时设置FLAG_SECURE禁用截图
        window.setFlags(
            WindowManager.LayoutParams.FLAG_SECURE,
            WindowManager.LayoutParams.FLAG_SECURE
        )

        // 页面退出/销毁时恢复原始窗口标记
        onDispose {
            window.attributes.flags = originalWindowFlags
        }
    }

    // 页面内容示例
    Column(
        modifier = Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text(text = "此页面禁止截图,尝试截图会显示空白或提示无法截图")
    }
}

结合Navigation Compose使用(如果用导航组件)

如果你的应用使用Navigation Compose管理页面,只需将上述SecureScreen作为导航目标即可,DisposableEffect会在页面被导航到时执行设置,离开时自动触发onDispose恢复标记:

@Composable
fun AppNavHost() {
    val navController = rememberNavController()
    NavHost(navController = navController, startDestination = "home") {
        composable("home") { HomeScreen(navController) }
        composable("secure") { SecureScreen() } // 禁用截图的页面
    }
}

关键说明

  1. DisposableEffect的作用:它会在Composable首次渲染时执行初始化逻辑,在Composable从Composition中移除时执行onDispose,完美匹配页面的进入和退出时机。
  2. 恢复原始标记:保存并恢复窗口的原始flags,避免清除FLAG_SECURE时误删其他已设置的窗口属性,保证其他页面不受影响。
  3. 兼容性:FLAG_SECURE是Android系统原生API,主流设备均支持,部分厂商系统可能有特殊处理,但核心逻辑通用。

内容的提问来源于stack exchange,提问作者AbdulelahAGR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:21:06