[Android] スクリーンショットをされたことを検知する?

スポンサーリンク

導入:スクリーンショットを検知したい、という要望

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が最強
  • 設計で守るのが現実解

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

コメント

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