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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:29:06