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

「Pay アプリでこのスクリーンショットが検出されました」というメッセージ
図 1. スクリーンショット検出 API をサポートするアプリのスクリーンショットをユーザーが撮る場合に表示される、システム提供のトースト メッセージの例。

Android 14 では、スクリーンショット検出の標準化されたエクスペリエンスを実現するため、プライバシーを保護するスクリーンショット検出 API が導入されました。この API を使用すると、アプリはアクティビティごとにコールバックを登録できます。アクティビティが表示されている間にユーザーがスクリーンショットを撮ると、これらのコールバックが呼び出され、ユーザーに通知されます。

サポートされるユースケース

Android 14 では、ユーザーがハードウェア ボタンを特定の組み合わせで押した場合にのみ、システム API がスクリーンショットを検出します。この API は、スクリーンショットに関連するテストコマンド(ADB など)の実行時や、デバイスの現在の画面コンテンツをキャプチャするインストルメンテーション テストで撮影されたスクリーンショットを検出しません。

実装の手順

スクリーンショット検出を追加するには、新しいインストール時の権限である 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);