MinSdk21视频流App如何防止SYSTEM_ALERT_WINDOW应用捕获内容
Android视频流应用防内容捕获实现方案(适配MinSdk21)
核心认知澄清
FLAG_SECURE是Android系统原生提供的图层级防护标志,设计目标就是从系统合成层面拦截所有截屏、录屏、第三方应用抓屏行为,这个能力从Android 5.0(API21)就已完整支持。你之前遇到的防护失效问题,本质不是标志本身没用,而是没有覆盖到所有会暴露敏感内容的图层。
很多开发者遇到的“提前启动的录屏能抓到内容”问题,90%的原因是只给根Activity的Window设置了标志,没有覆盖到全屏播放、小窗浮层这些单独的Window实例,导致这些没打标的图层被录屏应用完整抓取。只要正确打标,不管录屏应用是提前启动还是后续启动,不管应用是通过MediaProjection录屏还是持有SYSTEM_ALERT_WINDOW权限做悬浮窗抓屏,系统都会在合成显示管线时,对所有打了FLAG_SECURE的图层输出黑屏、不向任何第三方捕获通道返回像素数据。
针对持有SYSTEM_ALERT_WINDOW权限应用的拦截实现
这类应用之所以能抓到内容,本质是绕过了系统的图层隔离保护,通过跨进程的图层读取拿到了未打SECURE标志的像素,对应适配API21的实现步骤:
- 全局覆盖所有Activity的Window安全标志,不要只在单个页面手动设置。在Application注册全局Activity生命周期回调,统一为每个Activity的Window打标:
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { activity.getWindow().setFlags( WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE ); } // 其余生命周期回调按空实现补全即可 });
- 对所有通过WindowManager添加的自定义视图(包括视频画中画浮层、版权提示弹窗、独立全屏播放窗口),在构造LayoutParams时主动加上
FLAG_SECURE标志:
WindowManager.LayoutParams secureFloatParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY ); secureFloatParams.flags |= WindowManager.LayoutParams.FLAG_SECURE; // 视图尺寸、位置等其他LayoutParams配置正常编写 windowManager.addView(yourSecureContentView, secureFloatParams);
这一步做完,持有SYSTEM_ALERT_WINDOW权限的应用哪怕悬浮在你的应用上层,系统也不会将打了SECURE标志的图层像素暴露给它,因为所有跨进程的图层读取都需要经过系统合成服务的权限校验。
- 阻断View树缓存的越权读取路径。从API21开始,SECURE标记的Window默认禁止生成View绘制缓存,你可以再主动给所有承载视频内容的敏感View加上防护配置,避免第三方应用通过反射拿到View的缓存位图:
videoContentView.setLayerType(View.LAYER_TYPE_HARDWARE, null); videoContentView.setDrawingCacheEnabled(false);
常见的防护失效坑点
- 避免被第三方库覆盖安全标志。很多视频播放框架在初始化、切换全屏模式时会重新设置Window的flags,把之前加的
FLAG_SECURE覆盖掉。你可以在每个Activity的onWindowFocusChanged回调里,重新检测并补上SECURE标志,防止标记被篡改。 - 不要把视频播放的Surface跨进程输出给其他应用。哪怕你自己的窗口打了SECURE标志,只要把Surface的引用传给没有打SECURE标记的第三方窗口,录屏应用就可以从对方的窗口层抓到你的视频内容。
- 音频泄露的拦截不需要依赖应用自身检测录屏状态。API21之后的系统MediaProjection音频通道,会对应用设置了
USAGE_MEDIA属性的播放音轨自动做抓取隔离,你只需要在初始化AudioTrack时正确设置媒体播放的音频属性,录屏应用就没法录制到你的应用音频。
内容的提问来源于stack exchange,提问作者Mahmoud Mabrok
相关产品推荐
相关产品推荐

