为了打造更加标准化的屏幕截图检测体验,Android 14 引入了可保护隐私的屏幕截图检测 API。借助此 API,应用可以按 activity 注册回调。如果用户在该 activity 可见时截取屏幕截图,系统会调用这些回调并通知用户。
支持的使用场景
在 Android 14 中,仅当用户按特定的组合硬件按钮时,系统 API 才会检测到屏幕截图。该 API 不会检测运行与屏幕截图相关的测试命令(包括 ADB 命令)时截取的屏幕截图,也不会在捕获设备当前屏幕内容的插桩测试中检测屏幕截图。
实现步骤
如需添加屏幕截图检测功能,请声明新的 DETECT_SCREEN_CAPTURE
安装时权限:
<uses-permission android:name="android.permission.DETECT_SCREEN_CAPTURE" />
然后,针对应用中用户可能会截取屏幕截图的每个 activity 完成以下步骤:
通过替换
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. } };
在 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); }
在 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);