ユーザーがデバイスのスクリーンショットを撮影したときに検出する

消息内容为“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);