Screenshot Detection APIでスクリーンショットを検知する

スポンサーリンク

導入:Androidでスクリーンショットは検知できるのか?

Androidアプリを作っていると、こんな相談を受けることがあります。

「ユーザーがスクリーンショットを撮ったら、何か処理したい」
「機密情報の画面でスクショを検知できませんか?」

結論から言うと、Android 14以降では公式にスクリーンショット検知APIが用意されています

ただし、何でもできる魔法のAPIではありません。
この記事では、Screenshot Detection API の できること・できないこと を含めて、実務目線で解説します。

先に結論です。

  • Android14以降でスクリーンショット検知が可能
  • 検知できるのは「撮られた事実」のみ
  • 設計と組み合わせて使うのが前提

Screenshot Detection APIとは

Screenshot Detection API は、
ユーザーがスクリーンショット操作を行ったことを検知するための公式APIです。

これまでAndroidでは、スクリーンショットを直接検知する手段はほぼ存在しませんでした。

Android14以降、このAPIを使うことで、
Activity表示中にスクリーンショットが撮られたことをコールバックで受け取れるようになりました。

このAPIで「できること」「できないこと」

できること

  • スクリーンショットが撮られた事実を検知
  • 検知をトリガーにUI表示やログ出力
  • 特定画面のみ検知対象にする

できないこと

  • スクリーンショット画像の取得
  • バックグラウンド状態での検知
  • すべてのスクショ手段の完全検知

ここを誤解すると、
「思ってたのと違う」実装になります。

必要な権限

Screenshot Detection API を使うには、
以下の権限を AndroidManifest.xml に追加します。


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

この権限はインストール時に付与され、
ランタイムパーミッションの要求は不要です。

基本実装(Kotlin)

コールバックの定義


val screenCaptureCallback = Activity.ScreenCaptureCallback {
    // スクリーンショット検知時の処理
    Toast.makeText(this, "Screenshot detected", Toast.LENGTH_SHORT).show()
}

ライフサイクルに合わせて登録


override fun onStart() {
    super.onStart()
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
        registerScreenCaptureCallback(mainExecutor, screenCaptureCallback)
    }
}

override fun onStop() {
    super.onStop()
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
        unregisterScreenCaptureCallback(screenCaptureCallback)
    }
}

register / unregister を必ず対で書くのがポイントです。

実務でハマりやすいポイント

① Activityごとに登録が必要

ApplicationやBaseActivityに書けばOK、
というAPIではありません。

② APIレベル分岐を忘れる

Android14未満では存在しないAPIなので、
必ずバージョンチェックを入れます。

③ スクショを止められると誤解する

このAPIは検知のみです。
禁止したい場合は FLAG_SECURE を使います。

FLAG_SECUREとの使い分け

検知したい → Screenshot Detection API

ユーザー行動を把握したい場合はこちら。

絶対に撮らせたくない → FLAG_SECURE

金融・認証系画面ではこちらが正解です。

テスト・デバッグの注意点

  • ADBや自動テストでは検知されない
  • 実機操作でのみ発火する
  • 一部メーカー独自UIでは挙動差が出る場合あり

実務でのおすすめ用途

  • 注意喚起メッセージの表示
  • ログ収集・分析用途
  • 機密画面での補助的セキュリティ

よくある質問

Q. スクリーン録画も検知できますか?

このAPIはスクリーンショット専用です。

Q. バックグラウンドでも検知できますか?

できません。表示中のActivityのみ対象です。

まとめ

  • Screenshot Detection APIはAndroid14以降限定
  • 検知できるのは「撮られた事実」だけ
  • 設計と組み合わせて使うのが前提

迷ったら:スクショを検知しすぎない。
それが一番安全な判断です。

コメント

タイトルとURLをコピーしました