導入: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以降限定
- 検知できるのは「撮られた事実」だけ
- 設計と組み合わせて使うのが前提
迷ったら:スクショを検知しすぎない。
それが一番安全な判断です。


コメント