0

現在、実際のデバイスでの動きを一時的にシミュレートするために、ファイルからいくつかの 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);
    }
4

1 に答える 1

0

電話の現在の場所を取得し、メソッドでその場所を使用するには、LocationManagerとを実装する必要があります。コードには既に がありますが、参考として、このコールバック システムの設定方法に関するドキュメントは、こちらこちらにあります。LocationListenerstopMockingLocationLocationManager

LocationManager基本的に、ワイヤレスNETWORK_PROVIDERまたはのいずれかからアップデートを取得するように を設定しますGPS_PROVDER。これにより、指定したパラメータ内で変更が登録された場合に、新しい位置情報が にフィードLocationListenerされます (変更が登録される時間と距離の範囲を設定できます)。

最後に、LocationListener次のメソッドが表示されます。onLocationChanged

private final LocationListener listener = new LocationListener() {      
    @Override     
    public void onLocationChanged(Location location) {         
    // A new location update is received.  Do something useful with it.           
    }     
};  

これは、定義した時間と距離のパラメーター内で電話の位置が変化したときに呼び出されるものです。モックをやめたらユーザーの場所を取得するだけの場合は、インスタンス変数を作成し、メソッド内からその変数にユーザーの場所を保存してから、onLocationChangedメソッド内からその場所にアクセスできますstopMockingLocation。または、内部から他のメソッドを呼び出すこともできますonLocationChangedが、何をしようとしているのか正確にわからないため、お勧めできません。

于 2013-03-14T15:44:50.353 に答える