Android P系统下FLAG_SECURE失效,如何禁用截图功能?
解决Android P上
FLAG_SECURE无法阻止截图的问题 我之前也碰到过Android P上FLAG_SECURE失效的情况,确实有点头疼,不过有几个实用的方案可以尝试:
1. 确保在正确的生命周期节点设置Flag
Android P对Window的Flag管理有一些变化,仅在onCreate()里设置可能会被系统重置。建议在onResume()方法中也重复设置,确保每次页面回到前台时Flag都生效:
@Override protected void onResume() { super.onResume(); // 重复设置FLAG_SECURE,避免系统重置 getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); }
如果你的页面使用了Fragment,别忘了给宿主Activity的Window设置Flag,或者在Fragment的onViewCreated()中主动获取Activity的Window进行设置。
2. 给所有悬浮窗/额外Window设置FLAG_SECURE
Android P开始,独立的悬浮窗(比如应用内的弹窗、全局悬浮球)不会继承Activity的Flag设置,如果你的App有这类Window,必须单独给它们添加FLAG_SECURE:
// 创建悬浮窗LayoutParams时添加FLAG_SECURE WindowManager.LayoutParams floatWindowParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : WindowManager.LayoutParams.TYPE_PHONE, // 必须包含FLAG_SECURE WindowManager.LayoutParams.FLAG_SECURE | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT );
3. 监听截图事件做补救处理
如果上述方法仍无法完全阻止(比如部分厂商定制ROM的特殊截图逻辑),可以监听系统截图文件的生成,及时删除或隐藏截图:
private MediaScannerConnection mediaScannerConnection; private void startScreenshotListener() { MediaScannerConnection.MediaScannerConnectionClient client = new MediaScannerConnection.MediaScannerConnectionClient() { @Override public void onMediaScannerConnected() { // 监听系统截图目录 String screenshotPath = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES) + "/Screenshots/"; mediaScannerConnection.scanFile(screenshotPath, null); } @Override public void onScanCompleted(String path, Uri uri) { File screenshotFile = new File(path); // 判断是否为1秒内生成的新截图 if (screenshotFile.exists() && System.currentTimeMillis() - screenshotFile.lastModified() < 1000) { screenshotFile.delete(); } mediaScannerConnection.disconnect(); } }; mediaScannerConnection = new MediaScannerConnection(this, client); mediaScannerConnection.connect(); }
注意:这个方法需要WRITE_EXTERNAL_STORAGE权限,且不同厂商的截图目录可能有差异,需要针对性适配。
4. 检测并提示用户关闭干扰服务
部分无障碍服务、第三方截图工具可能会绕过FLAG_SECURE,你可以在App启动时检测这类服务是否开启,给用户弹出提示引导关闭。
内容的提问来源于stack exchange,提问作者Akansha Goel
相关产品推荐
相关产品推荐

