Android の ML Kit とスクリーンキャプチャのメモ書き
Android で画面をキャプチャしながらいい感じにテキスト抽出してみたいな、と考えて、色々試してみました。Android 開発の基礎力がないので、つぎはぎなんとかならないかと調べてみた、雑多なメモ書きだと思ってください。
ML Kit でのテキスト検出
この ML Kit のドキュメントを見ながら、自力で空のプロジェクトに追加してみようとしたのですが、Android 開発の基礎力がなさすぎて断念。
冒頭に codelab へのリンクがあったので、そちらに頼ることにしました。
codelabs.developers.google.com
こちらはコードをダウンロードして starter に少しコードを書き足すだけだったので、問題なく動いてくれました。やさしいですね。コードは Java なので、Kotlin プロジェクトに適用するときは色々と変わるところがありそうです。
画像を選択するところに選択肢を増やして、読み取らせることもできました。
Codelab の MLKit サンプルに毛をはやして遊んでる pic.twitter.com/r53VmCYTGl
— りちゃ🏠🌈 (@rch850) 2021年3月28日
Media Projection API でのスクリーンキャプチャ
キャプチャについては公式のサンプルに頼ってみました。動くことが分かっているものに手を入れていくスタイルのほうが、初心者にとってはやさしいと思うので。
この ScreenCapture というサンプルが、 Media Projection API を使ってキャプチャするサンプルです。難なく動きました。
組み合わせ
このサンプルだけでは、キャプチャして画面に表示するだけなので、ML Kit に流し込むため Bitmap にする方法を調べました。
TechBooster さんの記事、もう6年前ですが、これで大体の流れは分かりました。結局 Codelab のサンプルに、この記事を参考にしながらスクリーンキャプチャを組み込む実装となりました。
Bitmap にするときに次のようなエラーが出てしまったのですが、PixelFormat.RGBA_8888 にすればよいという記事があったので、その通りやってみたらエラーは出なくなりました。
E/ImageReader_JNI: Producer output buffer format: 0x1, ImageReader configured format: 0x4 D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.android.screencapture, PID: 11064 java.lang.UnsupportedOperationException: The producer output buffer format 0x1 doesn't match the ImageReader's configured buffer format 0x4. at android.media.ImageReader.nativeImageSetup(Native Method)
ここまでの実装だと、他のアプリがフォアグラウンドになっているときのキャプチャができませんでした。フォアグラウンドサービス化などを試してみたいと思います。