現在、実際のデバイスでの動きを一時的にシミュレートするために、ファイルからいくつかの GPS データをモックして、Android アプリケーションの LocationProvider をテストしています。また、モック データから実際のデータにその場で切り替えたいと考えています。次のコードは、ファイルから読み取った GPS データのモックに問題なく機能します。ただし、GPS データのモックを停止しようとすると、現在の場所がファイルから最後に読み取られた GPS 信号でスタックします。
実際の Android アプリケーションのコードを変更したくないので、name に関連付けられた LocationProvider に模擬データを書き込みますGPS_Provider
。ロケーションベースのアプリケーションは、`requestLocationUpdates(LocationManager.GPS_Provider, , ) を呼び出すだけで、モック化されたデータを読み取ることができます。注意が必要なのは、実際のデータを再度配信するために GPS LocationProvider をリセットすることです。ここで立ち往生し、再度設定する方法がわかりません。
private AssetManager assetManager;
private LocationManager locationManager;
private String locationProviderName = LocationManager.GPS_Provider;
private List<Location> allMockedPositions;
private Handler handler;
private int position;
private Runnable runner = new Runnable() {
@Override
public void run() {
if (position <= allMockedPositions.size()) {
Location mockedLocation = allMockedPositions.get(position++);
locationManager.setTestProviderLocation(locationProviderName, mockedLocation);
handler.postDelayed(runner, 500);
}
}
};
public MockLocationProvider(Context context) {
assetManager = context.getAssets();
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
}
public void startMockingLocation(Route route) {
allMockedPositions = LocationData.getRouteData(assetManager, route, locationProviderName);
startMocking();
}
private void startMocking() {
position = 0;
handler = new Handler();
handler.post(runner);
}
public void stopMockingLocation() {
locationManager.clearTestProviderLocation(locationProviderName);
stopMocking();
}
private void stopMocking() {
handler.removeCallbacks(runner);
}