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

Android防截屏录屏如何避免出现空白黑色矩形块

问题根因

单独对悬浮服务视图所属的独立Window添加WindowManager.LayoutParams.FLAG_SECURE标记时,系统在截屏、录屏输出的帧中会直接把该独立Window的安全区域渲染成纯黑占位,这是Android对跨进程悬浮窗的默认安全处理逻辑,不存在参数配置错误的问题,也没法靠单独调整悬浮窗LayoutParams解决。

可行实现方案
  • 方案1:统一Window安全上下文,消除独立黑块
    不要只给主界面或者悬浮窗单独加FLAG_SECURE,要把主界面和悬浮窗归到同一个安全Window组里:
    1. 主Activity在onCreate生命周期、setContentView调用前就给当前Window加安全标记:
      // Java写法
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
      
      // Kotlin写法
      window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
      
    2. 悬浮窗创建时不要用Application类型的Context,必须使用当前已经加了安全标记的主Activity的Context来创建Window实例,同时给悬浮窗的LayoutParams也加上FLAG_SECURE。这种情况下悬浮窗和主界面属于同一个安全Window分组,系统录屏/截屏时会直接屏蔽整个应用的所有可见内容,不会单独给悬浮窗区域渲染黑块。
      注意:这个方案的限制是主Activity必须在活跃栈顶,悬浮窗才会有防截屏效果,如果需要应用退到后台后悬浮窗依然保持防录屏能力,用方案2。
  • 方案2:录屏/截屏状态监听+内容动态隐藏兜底
    1. 只给所有应用内Activity的Window加FLAG_SECURE,覆盖主界面的防截屏需求,悬浮窗Window本身不加这个标记,从根源避免黑块生成。
    2. 注册系统录屏状态监听:Android 14及以上版本直接调用Window的registerScreenCaptureCallback接口注册截屏/录屏回调,低版本可以通过MediaProjectionManager检测活跃的录屏任务。一旦检测到截屏/录屏行为触发,立刻把悬浮服务视图设为不可见,或者直接从WindowManager移除悬浮窗;等录屏/截屏任务结束后,再重新把悬浮视图挂载回去。
      这个方案不管应用在前台还是后台都能生效,也不会留下黑块痕迹。
  • 方案3:替换系统悬浮窗实现,改用应用内悬浮层
    如果你的悬浮视图不需要在应用退后台后跨应用显示,完全没必要用WindowManager加系统级悬浮窗。直接把自定义悬浮视图添加到主Activity的根DecorView上,这时候整个悬浮层属于主Activity的视图树,跟着主界面一起受FLAG_SECURE标记保护,截屏录屏时整个内容都会被屏蔽,根本不会出现黑块占位问题。
注意事项

不要尝试通过反射修改系统Window的安全渲染逻辑,相关处理逻辑跑在系统服务层,高版本Android上会直接触发权限拦截,还会导致应用过不了合规检测。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:39:14