Android 14 では、スクリーンショット検出の標準化されたエクスペリエンスを実現するため、プライバシーを保護するスクリーンショット検出 API が導入されました。この API を使用すると、アプリはアクティビティごとにコールバックを登録できます。アクティビティが表示されている間にユーザーがスクリーンショットを撮ると、これらのコールバックが呼び出され、ユーザーに通知されます。
サポートされるユースケース
Android 14 では、ユーザーがハードウェア ボタンを特定の組み合わせで押した場合にのみ、システム API がスクリーンショットを検出します。この API は、スクリーンショットに関連するテストコマンド(ADB など)の実行時や、デバイスの現在の画面コンテンツをキャプチャするインストルメンテーション テストで撮影されたスクリーンショットを検出しません。
実装の手順
スクリーンショット検出を追加するには、新しいインストール時の権限である DETECT_SCREEN_CAPTURE
を宣言します。
<uses-permission android:name="android.permission.DETECT_SCREEN_CAPTURE" />
次に、ユーザーがスクリーンショットを撮る可能性があるアプリのアクティビティごとに、次の手順を行います。
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. } };
アクティビティの
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); }
アクティビティの
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);