導入:スクリーンショットを検知したい、という要望
Androidアプリ開発をしていると、
ときどきこんな要望が出てきます。
「この画面、スクリーンショットを取られたら検知したい」
「スクショされたら警告を出せませんか?」
結論から言うと、
Androidでは“完全なスクリーンショット検知”はできません。
ただし、
できること・できないことを理解した上での“現実的な対応”は存在します。
先に結論です。
- スクリーンショットの完全検知は不可
- 一部バージョン・条件下での検知は可能
- 設計でカバーするのが正解
なぜスクリーンショット検知が難しいのか
最大の理由は、
Androidのプライバシー設計です。
スクリーンショットは、
OSレベルのユーザー操作として扱われます。
- どのアプリが撮ったか分からない
- いつ撮ったかをアプリが知れない
- 他アプリの挙動を監視できない
そのため、
「スクショされた瞬間に100%検知する」APIは存在しません。
よくある誤解
「MediaStoreを監視すれば分かるのでは?」
確かに、過去には以下のような実装がありました。
- スクリーンショット保存フォルダを監視
- 画像追加をトリガーに検知
しかし現在では、
Scoped Storageの影響でほぼ使えません。
「他アプリは検知しているように見える」
それは多くの場合、
擬似的な検知 or 別の仕組みです。
Androidで可能な検知手段(限定的)
① FLAG_SECURE を使う(最重要)
検知ではなく、
そもそもスクリーンショットを禁止する方法です。
window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
)
これを設定すると、
- スクリーンショット不可
- 画面録画不可
になります。
金融・認証系アプリでは、
事実上これが唯一の正解です。
② Android 14+ の Screenshot Detection API
一部の新しいAPIでは、
スクリーンショット検知コールバックが追加されています。
ただし注意点があります。
- 対応OSが限定的
- 全デバイスで保証されない
- 仕様変更リスクが高い
現時点では、
補助的な扱いに留めるべきです。
③ Activityのライフサイクル変化を使う(疑似)
スクショ操作時に、
- onPause / onResume が呼ばれる
場合があります。
ただしこれは、
誤検知が非常に多いです。
やってはいけない実装
MediaStore全監視
パフォーマンス・プライバシー両面でNGです。
常駐サービスでの監視
OSに殺されるか、
ストア審査で弾かれます。
無理やり権限を要求する
ユーザー体験を壊すだけです。
実務での正解パターン
① 機密画面はFLAG_SECURE
これ以上の正解はありません。
② スクショ前提でUIを設計する
・個人情報を直接表示しない
・一部をマスクする
③ 検知できたら「通知」ではなく「ログ」
ユーザーにバレない形で、
分析用途に使うのが現実的です。
よくある質問
Q. iOSではできるのに?
OS思想が違います。Androidでは制限が強いです。
Q. 録画検知は?
基本的にスクショと同様です。
まとめ
- 完全なスクショ検知は不可能
- FLAG_SECUREが最強
- 設計で守るのが現実解
迷ったら:スクショを検知しようとしない。
それが一番安全です。


コメント