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

如何在Android One设备上实现禁止截屏或截屏内容显示为黑屏效果

Android One设备禁止截屏失效解决方案

问题根因

你当前使用的FLAG_SECURE逻辑本身没有问题,在Android One设备上失效的核心原因通常是FLAG设置时机错误、渲染层未全覆盖、特殊场景适配缺失三类:

  • 仅给Activity主窗口设置了FLAG,未覆盖Dialog、PopupWindow、SurfaceView/TextureView等独立渲染的组件
  • FLAG设置时机晚于页面渲染(比如放在setContentView之后调用)
  • 高版本原生安卓的多窗口、分屏、画中画模式下未重新触发FLAG设置

可行解决方案

1. 修正FLAG_SECURE设置逻辑

必须在所有页面渲染操作之前设置FLAG,同时覆盖所有窗口类型:

// Activity 场景
override fun onCreate(savedInstanceState: Bundle?) {
    // 排在 super.onCreate 和 setContentView 之前调用
    window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // 若存在SurfaceView/TextureView(视频、游戏渲染场景),额外添加安全标记
    val playSurface = findViewById<SurfaceView>(R.id.play_surface)
    playSurface.setSecure(true)
}

// Fragment 场景,尽早绑定Activity窗口属性
override fun onAttach(context: Context) {
    super.onAttach(context)
    requireActivity().window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
}

// Dialog/PopupWindow 场景,给独立窗口也添加标记
val secureDialog = Dialog(this)
secureDialog.window?.apply {
    setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
}
secureDialog.setContentView(R.layout.dialog_secure)

2. 适配特殊系统场景

针对Android One设备搭载的原生高版本安卓系统,补充以下适配逻辑:

  • 监听多窗口/分屏状态变更,回调触发时重新给窗口设置FLAG_SECURE
  • 若应用支持画中画模式,进入画中画时重新给画中画窗口添加安全标记
  • 排查所有临时移除FLAG_SECURE的逻辑(比如部分业务需要生成分享截图时临时移除FLAG,操作完成后必须立刻重新添加)

3. 兜底拦截方案

如果以上配置后仍存在漏洞,可以添加截屏监听逻辑,触发截屏时瞬间弹出全黑全屏控件遮挡页面内容,实现和AmazonPrime等应用一致的黑屏截图效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:45:01