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

