【kotlin】Androidでスクリーンショットを実装する方法(サンプルプロジェクトあり)

趣味開発でスクリーンショットを取ろうとしてググってたらなんかやけに複雑で気が滅入ってたんですが実際やってみたら存外ちょろかったので記します。

サンプルもあるのでそのまま動くよ。

では、いってみましょう。

先にサンプル置いときますね。

https://github.com/sasasaiki/android-kotlin-screenshot-sample

対象読者

Androidアプリ開発しててスクリーンショット取りたいと思ってる人。

Kotlinのスクリーンショットサンプルを探してる人。

参考

こちらの記事を参考にさせていただきました。

とても参考になりました。本当にありがとうございます。。。!

こちらの記事の実装から、間に挟んであるserviceが私には必要なかったので削除して(一応別ブランチにserviceを挟んだものもありますが)、画像をキャッシュするところまで実装を加えて自分好みにごにょごにょした感じになっております。

あと、サービスでも結果を受け取れるようにsendBroadcasを使ってキャプチャ終了イベントを受け取ってます。(ちょっとオシャレっぽくないですか?)

スクリーンショットの流れ

Android 5.0 (Lollipop・Android SDK Level 21)からMediaProjection APIというスクリーンショットやキャプチャを撮るためのAPIが使えるようになったらしいのでそれを使います。

流れとしては、

Activityを起動->mediaProjectionManagerを使ってScreenCapture用のActivityを起動->取得できるBitmapをよしなにどうぞ

って感じです。

実装

CaptureActivity

こいつを任意のActivityやSeviceからstartすることでスクリーンショットを取ります。

mediaProjectionManagerを使ってのScreenCapture用のActivityの起動と受け取ったBitmapの保存、キャプチャ終了をsendMessageしたりします。

今回は受け取ったBitmapをキャッシュに保存しています。キャッシュのコードはもう少し後に出てきます。

Capture

先ほどのCaptureActivityで生成したMediaProjectionとやらからスクリーンの情報を受け取っり、bitmapを生成しCallBackします。

ここでスクリーンショットの範囲などを指定することができそうです。(今回は何も考えず画面全体を撮っています)

Cache

bitmapをそれ用に用意されているクラスLruCacheを使ってキャッシュします。

今回は最大一枚に制限しています。

bundleとか使って取り回してもいいのかもしれませんがまあキャッシュに持たせとけばどこからでもアクセスできて楽なのでとりあえずキャッシュに載せてます。

ストレージに保存する場合は別に使う必要はないです。

styles.xml

CaptureActivityがスクリーンショットに写り込んでしまってもしょうがないのでアクティビティを透明にするstyleを定義します。

styles.xmlは最初からあるのでそこに以下を追記します。

でAndroidManifest.xmlのCaptureActivityのところをこうします。

これで準備はオッケー

使い方

基本的にはCaptureActivityを実行するだけですが今回はキャプチャ終了を受け取るためにReceiverをセットしたりします。

撮ったスクリーンショットを即ImageViewにセットしてます。

一応レイアウトも置いておきますがAndroidStudioが作ったものにImageViewを追加しただけです。

activity_main

content_main

以上です。

まとめ

ということでスクリーンショットを撮る方法でした。

まあ順番に見ていけばそんなに難しくないですね。

後サンプルが多分そのまま動くと思うのでぜひ使ってもらえればと思います。

with-serviceブランチにサービスをワンクッション入れたものも入ってます。

https://github.com/sasasaiki/android-kotlin-screenshot-sample

ではまた。

自己紹介
Android開発エンジニアです。
kotlinがお気に入り。

 

おすすめ

Udemyのビデオ講座は本当に捗るので学習にとてもおすすめです。まじで。


スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください