2011/06/12

Android端末のスクリーンショット保存を補助するスクリプト

今回は、過去に紹介したいくつかの機能を組み合わせて、Android端末のスクリーンショット撮影を補助するツールを作成する例を紹介します。
Android端末のスクリーンショットを保存する方法としては、Android SDKに同梱のDDMSというプログラムを使用するのが代表的ですが、1枚の画像を保存するために「更新ボタンを押す→保存ボタンを押す→保存ファイル名を指定」という手間が必要で、あまり使い勝手がよくありません。
そこで、特定のキーを押すだけで最新の画面を連番ファイル名で保存出来るようにします。
var Clipboard=require('Clipboard').Clipboard;
var dir=cwd().directory("E:\\docs\\work\\NR_android\\ss");
var prefix="ss_", len=3, num=1;

Main.createNotifyIcon();
Main.process.priority=Process.priority.high;

require('Hotstrokes').Hotstrokes.defineConditions({
    DDMS:function()(this.activeWindow.title=='Device Screen Capture'),
}).map('DDMS',{
    "NumEnter":function(){
        Thread.create(function(){
            var fmt=prompt('change prefix / number'), m;
            if(fmt.match(/^\d+$/)){
                num=fmt*1;
            }else if(m=fmt.match(/^(.*?)(\d+)$/)){
                prefix=m[1];
                len=m[2].length;
                num=m[2]*1;
            }else{
                prefix=fmt;
            }
            Main.notifyIcon.showInfo('Next: '+dir.file(prefix+num.format(len)+'.png'));
        });
    },
    "NumMinus":function(){
        num--;
        Main.notifyIcon.showInfo('Next: '+dir.file(prefix+num.format(len)+'.png'));
    },
    "NumPlus":function(){
        num++;
        Main.notifyIcon.showInfo('Next: '+dir.file(prefix+num.format(len)+'.png'));
    },
    "Num0":function(){
        Thread.create(function(w){
            w.control('Button',0).lbuttonClick();
            sleep(800);
            w.control('Button',3).lbuttonClick();
            sleep(500);
            var file=dir.file(prefix+num.format(len)+'.png');
            try{
                var img=Clipboard.image;
                img.save(file);
            }finally{
                free(img);
            }
            Main.notifyIcon.showInfo('Saved: '+file);
            num++;
        },this.activeWindow);
    },
}).register();
キーボード操作への割り当てにはHotstrokesを使用します。端末の操作をしながら撮影操作を行なうため、押しやすいテンキーの0に割り当てることにします。
DDMSのキャプチャウィンドウがアクティブな時だけ有効になるように、ウィンドウタイトルで判定する条件を定義して、その条件下への割り当てを行ないます。

画像の保存は、ウィンドウ上のボタンの自動クリックにより画面の更新とクリップボードへのコピーを実行させた後、Clipboardユニットの画像取得機能で取得した画像を保存することで実現しています。
ボタンを押してからDDMS側で処理が完了するまでにはタイムラグがあるので、適当にsleep()を入れて待機します。
一連の処理には時間がかかるため、キー操作をブロックしないように新規スレッド上で行なうようにしています。

Clipboard.imageで取得したImageオブジェクトはfree()で解放しなければならないことに注意が必要です。
(Clipboardユニットの開発時点では、取得の度にコピーを生成しなければならないケースを想定していなかったため、このような仕様になっています)

その他、プレフィクスや番号をプロンプトで指定する機能や、間違えて撮影したときのために連番を巻き戻す機能を用意しました。
保存先ディレクトリは、頻繁に変更するものではないので、スクリプト上にハードコーディングしています。

簡単なスクリプトですが、通常のスクリーンショット保存手順に比べるとかなり手間が軽減できるはずです。