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

如何隐藏Android系统截图工具栏并检测截图显示自定义工具栏?

Android允许截图并替换自定义工具栏方案

1. 先移除FLAG_SECURE

你之前用的FLAG_SECURE是用来禁止截图的,这完全和你的需求相悖,必须先清除这个标记才能允许截图并捕获事件:

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);

2. 检测截图操作

目前有两种可靠的方式检测系统截图:

方式一:监听媒体库变化

系统截图默认会保存到媒体目录,通过ContentObserver监听图片媒体库的新增文件,判断是否为截图:

private ContentObserver screenshotObserver;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 初始化截图观察者
    screenshotObserver = new ContentObserver(new Handler(Looper.getMainLooper())) {
        @Override
        public void onChange(boolean selfChange, Uri uri) {
            super.onChange(selfChange, uri);
            Cursor cursor = getContentResolver().query(uri, null, null, null, null);
            if (cursor != null && cursor.moveToFirst()) {
                String filePath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                String fileName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
                cursor.close();

                // 根据文件名/路径判断是否为截图(兼容不同厂商命名)
                if ((fileName.contains("Screenshot") || fileName.contains("截图")) 
                    && filePath.contains("screenshots")) {
                    // 触发自定义工具栏展示
                    showCustomToolbar();
                }
            }
        }
    };
    // 注册观察者
    getContentResolver().registerContentObserver(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            true,
            screenshotObserver
    );
}

@Override
protected void onDestroy() {
    super.onDestroy();
    // 注销观察者避免内存泄漏
    if (screenshotObserver != null) {
        getContentResolver().unregisterContentObserver(screenshotObserver);
    }
}

private void showCustomToolbar() {
    // 这里写你自定义工具栏的展示逻辑
}

注意:不同厂商的截图命名可能有差异,需要多添加几个关键词适配。

方式二:使用无障碍服务(更准确)

通过监听系统截图通知来检测,准确率更高,但需要用户授权无障碍权限:

  1. 创建无障碍服务类:
public class ScreenshotDetectService extends AccessibilityService {
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
            for (CharSequence text : event.getText()) {
                if (text.toString().contains("截图") || text.toString().contains("Screenshot")) {
                    // 发送广播通知应用展示自定义工具栏
                    Intent intent = new Intent("com.your.package.SCREENSHOT_TRIGGERED");
                    sendBroadcast(intent);
                }
            }
        }
    }

    @Override
    public void onInterrupt() {}
}
  1. 在Manifest中注册服务:
<service
    android:name=".ScreenshotDetectService"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/accessibility_config" />
</service>
  1. 新建res/xml/accessibility_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeNotificationStateChanged"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:canRetrieveWindowContent="true" />

3. 关于隐藏系统截图工具栏

系统截图工具栏是系统级UI,应用没有权限直接隐藏,但可以通过以下方式优化体验:

  • 检测到截图后快速弹出自定义工具栏,视觉上覆盖或引导用户使用自定义工具;
  • 针对小米、华为等厂商做私有API适配(部分厂商提供了隐藏工具栏的接口,但需要单独申请权限);
  • 在应用首次启动时,引导用户进入系统设置手动关闭截图工具栏(不同厂商设置路径不同,需给出对应指引)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:15:40