目的
- Pattern LockをAndroid Debug Bridge上から解除する
- Pattern Lockってこんなやつね → Google画像検索
問題点
- Android Debug Bridge(adb)にはswipeの機能が一応組み込まれているのだが,2点しか選択できないため複雑なswipe操作ができない.
adb -s <Device ID> shell input swipe x1 y1 x2 y2
解決案
- UiAutomatorを使用すれば多段Swipeができそうじゃないか?と[API](http://developer.android.com/tools/help/uiautomator/UiDevice.html#swipe(android.graphics.Point[], int))見てて気づく.
- 実際実行してみる → できたー!ってなった.
実装
- UiAutomatorのプロジェクトの作り方などは他に譲るとして.
UiAutomator.java
public void swipe(){
Bundle args = this.getParams();
String x_str = args.getString("x");
String y_str = args.getString("y");
StringTokenizer x = new StringTokenizer(x_str, ",");
StringTokenizer y = new StringTokenizer(y_str, ",");
assertTrue(x.countTokens() == y.countTokens());
Point[] point = new Point[x.countTokens()];
int i = 0;
while(x.hasMoreTokens()){
point[i] = new Point(
Integer.parseInt(x.nextToken()), Integer.parseInt(y.nextToken()));
i++;
}
getUiDevice().swipe(point, 10);
}
- 多段Swipeを一度の動作で行うため,今回はx座標,y座標をStringとして投げている.投げる値の例は”100,200,300”みたいな感じ.
- その値をStringTokenizerで切り出し,配列作ってぶち込んでUiDeviceクラスのswipeメソッドに投げている.
実行
- 実行については,まずUiAutomatorのプロジェクトで作成したjarファイルを対象のAndroid端末にpushします
adb -s <Device ID> shell push <Project名>.jar /data/local/tmp
- その後,テストをmethod単位で走らせます.
adb -s <Device ID> shell uiautomator runtest <Project名>.jar -c <Package名>.<Class名>#swipe -e "x" "100,200,300" -e "y" "400,500,400"
結論
- 最近Pythonばかり触ってたから,Javaの記法忘れてた.