Android Mock Locationsを利用して、位置情報のテストをする
結論から言うと、失敗した話なんですが、記録のために書いておきます。
AndroidのGoogle Play Serviceを利用する位置情報APIについて最近書いておりますが、中でも下記のモックの位置情報で色々と位置情報アプリのテストができる、というのは魅力的ですね。
Testing Using Mock Locations
http://developer.android.com/training/location/location-testing.html#TestingTips
これからは、位置情報のテストをするために、実際に端末を持って動き回る必要はないのです。
いいのは、たとえば今まで他の偽位置情報送信アプリなどを使っていては、できなかった精度や速度の設定なんかもできるところです。
残念ながら、activity recognitionはテストできないみたいですね。
ちなみにactivity recognitionは、今歩いているのか、止まっているのか、車に乗っているのか、などが判定できる仕組みです。
しかも、移動する間隔なども決められるので、テストにはもってこいです。
自分の作ったアプリに変更を加えてどうこうするわけではなく、まずはGoogleさんの作ったテストアプリを使うと、Fused location providerにモックの位置情報を送れるので、それを利用しましょう。
下記のページの右上にある、青い「Download the Sample」というボタンをクリックして、サンプルアプリをダウンロードしましょう。
http://developer.android.com/training/location/location-testing.html#RunProvider
アプリをダウンロードしたら、普通にEclipseにインポートします。
私の環境では、SendMockLocationServiceがの
elapsedTimeNanos = SystemClock.elapsedRealtime();//elapsedRealtimeNanos(); mockLocation.setElapsedRealtimeNanos(elapsedTimeNanos);
がどうしても動作しませんでした。これって、ビルドターゲットがAPIレベル17以降にしないとsetElapsedRealtimeNanosがundefinedでエラーになります。
さて、これをmocklocationアプリと呼びますが、mocklocationアプリを立ち上げると、次のような画面になります。
Pause before test(secs)というボックスには、テストをスタートする前に、何秒待つか、を記入します。テストしたいアプリは後で立ち上げる、等と言う時に便利ですね!
Send intervalというボックスには、それぞれの位置情報を移動する間隔を記入します。
開始する時は移動しなくてよい場合は、Run onceをタップ、ぐるぐる移動させたい場合はRun continuouslyをタップします。
Run continuouslyをすると、Stop testをタップするまで移動が終了しません。
mocklocationアプリには、最初カリフォルニアの位置情報が書かれています。
LocationUtils.javaの次の部分に、自分がテストしたい緯度、経度、精度を入れましょう。
public static final double[] WAYPOINTS_LAT = { 37.377166, 37.380866, 37.381224, 37.382008, 37.385486, 37.387021, 37.384847, 37.385461}; // An array of longitudes for constructing test data public static final double[] WAYPOINTS_LNG = { -122.086966, -122.086945, -122.086344, -122.086151, -122.083941, -122.083104, -122.078683, -122.078265}; // An array of accuracy values for constructing test data public static final float[] WAYPOINTS_ACCURACY = { 3.0f, 3.12f, 3.5f, 3.7f, 3.12f, 3.0f, 3.12f, 3.7f };
準備ができたら…これで動作するわけではなく!
自分がテストしたい、位置情報アプリの方にもちょっとだけ変更が必要です!!
@Override public void onConnected(Bundle dataBundle) { // モックモード開始 mLocationClient.setMockMode(true); }
と書く必要があります。
もちろん、下記の条件も必要です。
- Google play のLocation を利用していること。上記のsetMockModeの以前に、下記が準備されていることです。
- テスト端末で、開発者向けオプション→疑似ロケーションを許可 にチェックが入っていること
- テストするアプリのAndroidManifest.xmlにて、
public LocationClient mLocationClient; ... // Connect to Location Services mLocationClient.connect();
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
が宣言されていること
さて、それらが終わったら、mocklocationアプリを動かしてみましょう!
テストしたい位置情報アプリで、位置情報が動作していれば、成功★!です。