[Android]フォルダブルデバイスの画面キャプチャ
Androidの世界に、少しずつフォルダブルデバイスが増えてきましたね。開発に活用していくぞ!の思いで、思い切って手を出してしまいました。
アプリのフォルダブル対応まで完了したので、 adbで画面キャプチャを撮ろう としたときに、カバーディスプレイの方でキャプチャを撮れないぞ?となったのでその対処方法をご紹介します。
遭遇した問題
Galaxy Fold3のadb画面キャプチャの取得を試みました。メインディスプレイ(端末を広げた状態の広い方のスクリーン)では、特に問題なく、画面キャプチャを取得できています。
次に、カバーディスプレイ(端末を閉じた状態の狭い方のスクリーン)では、端末上はアプリが正常に表示されているにも関わらず、画面キャプチャは真っ黒です。あれ、なんでやねん😇
対処への光
フォルダブルデバイスはマイナーだし、きっとまだ対応してないんだろうなくらいの気持ちで、Twitterでつぶやいたところ、 @tomoya0x00さんから、 adb shell screencapのオプションでdisplayを指定できたと思います! という素敵なヒントをいただきました。オプションでdisplayの指定ができるのは知らなくて、これはいけそうだ!と思い、早速試しました。ありがとうございます🙏
対処方法を見つけるまでの考察
adb shell screencapのオプションで何を使えるか分からなかったので、ターミナルで、
adb shell screencap -h
を実行して、使い方を確認しました。
usage: screencap [-hp] [-d display-id] [FILENAME]
-h: this message
-p: save the file as a png.
-d: specify the physical display ID to capture (default: 19261213734341250)
see "dumpsys SurfaceFlinger --display-id" for valid display IDs.
-dオプション でディスプレイIDなるものを指定すればよさそうです。が、そのディスプレイIDが分からんやん😇でもう1度読むと、 dumpsys SurfaceFlinger --display-id" を使うことでディスプレイIDを表示できると把握しました。
ということで、PCとFold3を接続した状態で、
adb shell dumpsys SurfaceFlinger --display-id
を実行しました。すると、まさに期待していた情報が表示されました(IDを念のためマスクしていますが、実際は全て数字です)😀
Display 1926XXXXXXXX0 (HWC display 0): port=130 pnpId=QCM displayName=""
Display 1926XXXXXXXX1 (HWC display 3): port=131 pnpId=QCM displayName=""
ということで、これらのディスプレイIDが、メインディスプレイとカバーディスプレイを指していそうです😋
では、いざ実行ということで、画面キャプチャを取得していきます。
フォルダブルデバイスの画面キャプチャ取得
メインディスプレイ編
- コマンド(ディスプレイIDは、環境に合わせて読み替えてください。)
adb shell screencap -p -d 1926XXXXXXXX0 /sdcard/screen.png;adb pull /sdcard/screen.png ~/Desktop/screen1.png
- 実行結果
こちらも期待通りに画面キャプチャを取得できていますね。
カバーディスプレイ編
- コマンド(ディスプレイIDは、環境に合わせて読み替えてください。)
adb shell screencap -p -d 1926XXXXXXXX1 /sdcard/screen.png;adb pull /sdcard/screen.png ~/Desktop/screen2.png
- 実行結果
お、真っ黒じゃないぞ!😀期待通りに画面キャプチャを取得できました。お疲れ様でした!