检测用户何时截取设备屏幕截图

Message reads 'Pay app detected this screenshot'
图 1. 用户截取支持屏幕截图检测 API 的应用屏幕截图时出现的系统提供的吐司消息示例。

为了创建更标准化的屏幕截图检测体验,Android 14 引入了一个保护隐私的屏幕截图检测 API。此 API 允许应用基于每个 Activity 注册回调。当用户在该 Activity 可见时截取屏幕截图时,将调用这些回调,并通知用户。

支持的用例

在 Android 14 中,如果用户执行特定组合的硬件按钮按下操作,系统 API 才会检测到屏幕截图。该 API 不会检测在运行与屏幕截图相关的测试命令(包括 ADB)或在捕获设备当前屏幕内容的检测测试中截取的屏幕截图。捕获设备的当前屏幕内容

实现步骤

要添加屏幕截图检测,请声明新的 DETECT_SCREEN_CAPTURE 安装时权限

<uses-permission android:name="android.permission.DETECT_SCREEN_CAPTURE" />

然后,为应用中用户可能捕获屏幕截图的每个 Activity 完成以下步骤

  1. 通过覆盖 onScreenCapture() 函数来实现回调。在此回调中,您的应用可以采取措施,例如警告另一个用户有人截取了消息对话的屏幕截图。

    Kotlin

    val screenCaptureCallback = Activity.ScreenCaptureCallback {
        // Add logic to take action in your app.
    }

    Java

    final Activity.ScreenCaptureCallback screenCaptureCallback =
        new Activity.ScreenCaptureCallback() {
            @Override
            public void onScreenCaptured() {
                // Add logic to take action in your app.
            }
        };
  2. 在 Activity 的 onStart() 方法中,注册屏幕截图回调。

    Kotlin

    override fun onStart() {
        super.onStart()
        // Pass in the callback created in the previous step 
        // and the intended callback executor (e.g. Activity's mainExecutor).
        registerScreenCaptureCallback(mainExecutor, screenCaptureCallback)
    }

    Java

    @Override
    protected void onStart() {
        super.onStart();
        // Pass in the callback created in the previous step 
        // and the intended callback executor (e.g. Activity's mainExecutor).
        registerScreenCaptureCallback(executor, screenCaptureCallback);
    }
  3. 在 Activity 的 onStop() 方法中,注销屏幕截图回调

    Kotlin

    override fun onStop() {
        super.onStop()
        unregisterScreenCaptureCallback(screenCaptureCallback)
    }

    Java

    @Override
    protected void onStop() {
        super.onStop();
        unregisterScreenCaptureCallback(screenCaptureCallback);
    }

控制捕获屏幕截图的能力

如果您不希望应用 Activity 的内容显示在屏幕截图中或不安全的显示器上,请设置 FLAG_SECURE 显示标志。

Kotlin

activity.getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE)

Java

activity.getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);