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();
}
}