funini.com 自由研究 SD Logger

IME の入力をシミュレートする

Instrumentation を使えばアプリの UI 操作は乗っ取れるんだけど、TextView で立ち上がった 色々頑張ったら出来ました。

Instrumentation を使って、キーイベントを送ってみる

package com.funini.monkie_app.test;

import android.app.Instrumentation;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import com.funini.monkie_app.MainActivity;

public class MonkieTester extends Instrumentation {
    public void onCreate(Bundle arguments) {
        super.onCreate(arguments);
        start();
    }

    public void onStart() {
        super.onStart();
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setClass(getTargetContext(), MainActivity.class);
        sendKeyDownUpSync(KeyEvent.KEYCODE_A);
    }
}

結果。以下のコマンドで実行します。
$ adb shell am instrument -w com.funini.monkie_app.test/com.funini.monkie_app.test.MonkieTester
"A" と出力されただけ。"あ"にはならなかった。 USB キーボードと view への入力は違うらしい。

Instrumentation を使って、タッチイベントを送ってみる

キー入力はうまく送れなかったので、次はタッチイペンとを送ってみます。
package com.funini.monkie_app.test;

import android.app.Instrumentation;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.view.KeyEvent;
import android.view.MotionEvent;
import com.sony.monkie_app.MainActivity;

public class MonkieTester extends Instrumentation {
    Handler mHandler = new Handler();
    public static final String TAG = "UpdaterDemo";
    MainActivity mA;
    @Override
    public void onCreate(Bundle arguments) {
        super.onCreate(arguments);
        start();
    }

    @Override
    public void onStart() {
        super.onStart();
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setClass(getTargetContext(), MainActivity.class);
        //a.showIME();
        //        try {
        //            Thread.sleep(100);
        //        } catch (InterruptedException e) {
        //            e.printStackTrace();
        //        }
        mA = (MainActivity)startActivitySync(intent);
        assert mA != null;
        mHandler.postDelayed(new Runnable() {

            @Override
            public void run() {
                mA.runOnUiThread(new Runnable() {
                    public void run() {
                        x();
                    }
                });
            }
        }, 1000);
        //a.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A));
        //a.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A));
        sendKeyDownUpSync(KeyEvent.KEYCODE_A);
        //sendCharacterSync(KeyEvent.KEYCODE_A);
    }
    public void x() {
        MotionEvent ev0 = MotionEvent.obtain(SystemClock.uptimeMillis(),
                SystemClock.uptimeMillis() + 100, MotionEvent.ACTION_DOWN, 320.0f, 700.0f, 0);
        MotionEvent ev1 = MotionEvent.obtain(SystemClock.uptimeMillis(),
                SystemClock.uptimeMillis() + 200, MotionEvent.ACTION_UP, 320.0f, 700.0f, 0);
        mA.dispatchTouchEvent(ev0);
        mA.dispatchTouchEvent(ev1);
        ev0.recycle();
        ev1.recycle();
    }
}