在使用者擷取裝置螢幕畫面時偵測

訊息顯示「付款應用程式偵測到此螢幕截圖」
圖 1. 當使用者在支援螢幕截圖偵測 API 的應用程式上進行螢幕截圖時,系統便會顯示如圖所示的浮動式訊息。

為建立更標準化的螢幕截圖偵測體驗,Android 14 推出了具隱私保護功能的螢幕截圖偵測 API。此 API 可讓應用程式依個別活動登錄回呼。當使用者在具備瀏覽權限的活動中拍攝螢幕截圖時,系統會叫用這些回呼,並傳送通知給使用者。

支援的用途

在 Android 14 中,只有在使用者按下特定的硬體按鈕組合時,系統 API 才會偵測到螢幕截圖。在執行與螢幕截圖相關的測試指令時 (包括 ADB),或在擷取裝置目前畫面內容的檢測設備測試期間,API 將不會偵測螢幕截圖動作。

導入步驟

如要新增螢幕截圖偵測功能,請宣告新的 DETECT_SCREEN_CAPTURE 安裝期間權限:

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

接著,針對應用程式中使用者可能會擷取螢幕截圖的每個活動完成下列步驟:

  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. 在活動的 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. 在活動的 onStop() 方法中,取消登錄螢幕截圖回呼:

    Kotlin

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

    Java

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

控制擷取螢幕畫面的功能

如果您不希望應用程式活動的內容顯示在螢幕截圖或不安全的螢幕上,請設定 FLAG_SECURE 顯示標記。

Kotlin

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

Java

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