前回、簡単にadbコマンドを解説したので、今回は、その応用として、PC側のバッチファイルで画面キャプチャを行う方法を解説しましょう。
adbコマンドは、Windows側のコマンドプロンプトウィンドウ内で実行され、その外側の環境はWindowsのcmd.exeが作り出しています。このため、Windowsのコマンドプロンプトの標準的な方法でadbコマンドを扱うことができます。
adbコマンドには、アンドロイドのシェルを起動する「adb shell」コマンドがありますが、1行のコマンドであれば、この後にアンドロイド(Linux)のコマンドを置いて実行させることも可能です。ただし、注意するのは、「adb shell」でシェルを起動した場合は、シェルから抜けるまでが1つのセッションとなるため、たとえば、環境変数は継続して利用できるのですが、一度、セッションを抜けてしまったり、adb shellにコマンドを付けて実行するような場合には、環境変数は初期化されてしまうために、ユーザーが設定した環境変数は消えてしまいます。
なので、adb shellの後にコマンドを付けて実行を行う場合、別のタイミングで実行するコマンドに環境変数で値を渡すといったことはできません。
ただし、ファイルを作るコマンドであれば、ユーザーが消すまではファイルが残っているので、大丈夫です。
アンドロイドのシェルから画面キャプチャを行うには、「screencap」コマンドを使います。引数の書式は以下のようになります。
screencap [-hp] [-d display-id] [FILENAME]
-h: this message
-p: save the file as a png.
-d: specify the display id to capture, default 0.
利用するときには、「screencap FILENAME.png」と拡張子をファイル名につけておけば、自動的にpng形式になるようです。それ以外の拡張子の場合、フレームバッファのダンプ形式が使われるようです。なので、PCなどで画像ファイルとして扱いたい場合には、「-p」オプションを付けるか、拡張子をpngにしたファイル名を指定しなければなりません。
さて、screencapでファイル名にパスを指定しておけば、指定したディレクトリにファイルが保存されます。これを取り出すときには、adb pullコマンドを使いますが、このときにファイル名を指定しなければなりません。つまり、バッチファイル内でなんらかの方法でファイル名を作り、それを記憶して、screencapコマンドとadb pullコマンドで指定しないと、キャプチャしたファイルを取り出すことができません。
しかし、ここで固定したファイル名にすると、前回キャプチャしたファイルを上書きしてしまい、必要なファイルをなくす可能性があります。このため、コマンドを実行するたびに毎回ちがうファイル名を指定するように現在の日時からファイル名を作り、これを使うようにします。
この部分は、アンドロイドと直接関係ないので、ちょっとだけ説明します。cmd.exeでは、「%date」と「%time」という環境変数で日時と時刻を取得できますが、区切り文字として「/」、「:」、「.」が入ってしまいます。環境変数設定のためのSETステートメントでは、変数に対しての置換が可能なので、これらを置き換えてしまいます。これが9、10行目(リスト01)で、ここからScreencapコマンド用のファイルパス指定を作っているのが13、14行目になります。最終的なファイルのパスは環境変数%pfに入ります。
これを使ってキャプチャを実際に行うのが31行目です。念のため「-p」オプションを指定してあります。
次にキャプチャしたファイルを取り出すのが、33行目です。なお、PC側の受け側のフォルダは、バッチファイルの最初の引数(%1)で指定可能ですが、指定がなかったときには、デフォルト値として%dafaultdistnation(3行目で定義)が使われます。このあたりの処理が21行目からです。なので、カレントディレクトリに保存したい場合には、バッチコマンドの引数として「.」を指定します。ここは、3行目の環境変数を自分で適当に編集してください。
なお、adbコマンドは、デバイスが接続されていないとダメなので、コマンドを実行するまえにチェックしているのが28行目の「adb wait-for-device」で、このadbサブコマンドは、デバイスが接続されるまで終了しないコマンドになり、adbコマンドを実行する前に実行すれば、デバイスを接続しないでコマンドを実行してしまうことを防ぐことが可能です。ちなみにadbコマンドは、エラーレベルを返さないので、ERRORLEVELステートメントによる処理はできません。
また、screencapコマンドでのキャプチャしたファイルの保存先のディレクトリは、6行目で定義しています。これは、「電源キー」+「ボリュームダウンキー」による画面キャプチャと同じフォルダになります。必要ならここも修正してみてください。
アンドロイドSDKがインストールしてあり、adbコマンドへのパスが設定してあれば、バッチファイルを起動するだけで画面キャプチャが行えます。キャプチャ画面を表示しないのでDDMSによる画面キャプチャよりも面倒がなく、実機を操作して行う画面キャプチャとちがって通知領域に何も表示されません。また、毎回ちがったファイル名にしてあるので、コマンドを何回も連続して実行可能です。
adbコマンドは、このようにWindowsのコマンドプロンプトからの実行やバッチファイルでの実行で簡単に制御可能です。前回の画面レコードや他のコマンドなどにも応用が可能です。
リスト01
@echo off
REM 環境依存。自分の環境に合わせてデフォルトの保存先フォルダを指定
SET dafaultdistnation=c:\temp\input-here
REM アンドロイド側の画像保存先(画面キャプチャ操作と同じ)
SET cappath=/sdcard/Pictures/Screenshots
REM "/",":","."を取り除く(SET/? 参照)
SET dt2=%date:/=%-%time::=%
SET dt=%dt2:.=%
REM 保存先ファイルパスを作成
SET filename=P%dt%.png
SET pf=%cappath%/%filename%
REM バッチファイル引数のチェックと設定
REM step1 あらかじめデフォルト値を設定しておく
SET tf=c:\temp\input-here
REM step2 引数がヌルだったらスキップ。そうでなければ引数を%tfに設定
IF %1/==/ GOTO skipfname
REM %1 is not empty
SET tf=%1
:skipfname
REM デバイスが接続しているかどうかをチェック
ECHO Wait for android device to ready
adb wait-for-device
ECHO Start! Screen Capture to %filename%
adb shell "screencap -p %pf%"
ECHO Capture! Wait for transfer to %tf%
adb pull %pf% %tf%
ECHO End transfer