概要
Android で画面のスナップショットを撮影するアプリを作ります。 他のアプリが起動しているときにスナップショットを撮影するために、サービス経由でスナップショット撮影を行います。
確認環境
- Android Studio 2.1.2
- Build Tools Version 24.0.1
- Compile SDK Version 24
- Target SDK Version 24
- Min SDK Version 21
- 実行環境 Sony SOV32 Android 6.0, API 23
参考情報
- Android 5.0 アプリからスクリーンショットを撮影する | TechBooster
- 画面のスナップショット撮影方法を解説。
- Android MediaProjectionManager in Service - Stack Overflow
- MediaProjectionManager をサービスで使いたいけど使えない。どうすればいいの?という話。
- androidでアプリからスクリーンショット撮る方法(超個人的メモ) – PPPNeXus Notes -代表の気まぐれブログ-
- こちらもサービスで使う話。Activity の static フィールドを使う。
- [Android]Activityを非表示にする | DevAchieve
- Theme.NoDisplay を指定する方法では問題あり。Theme.Translucent を使えば Activity は非表示に。
解説
MediaProjection を使用することで画面のスナップショットを撮影できる。 他アプリを実行中やホーム画面など、様々な画面のスナップショットを撮影するためには Service で実行する必要がある。 MediaProjection を使用するためには startActivityForResult を呼び出す必要があるが、Service では呼び出せない。 そのため、MediaProjection を取得する Activity (サンプルコードでは CaptureActivity) を用意し、Activity を Service から起動する。 この Activity は表示されないようにし、MediaProjection 取得後に終了する。 取得した MediaProjection は、Service から参照できるように static フィールド (Kotlin では companion object) に保持する。 Service では、Activity が保持している MediaProjection を参照して利用する。
サンプルコードを動かすにあたって、スナップショット撮影を Service から起動するためのボタンが欲しい。 下記の内容に従ってボタンを作成する。
ボタンをタップしたら、サンプルコードの CaptureService::enableCapture メソッドを呼ぶようにする。