5

私はこのコードを動作させようとしています:

Android での GPS のテスト

問題は、テストを実行すると、onLocationChanged() が呼び出されないことです。

public class LocationTest0 extends AndroidTestCase implements LocationListener {
private Location received = null;
public void testExample() {
    LocationManager lm = (LocationManager)this.getContext().getSystemService(Context.LOCATION_SERVICE);
    String testProvider = "Test";

    if (null == lm.getProvider(testProvider)){
        lm.addTestProvider(testProvider, false, false, false, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE);
    }

    lm.setTestProviderEnabled(testProvider, true);
    lm.requestLocationUpdates(testProvider, 0, 0, this);
    lm.setTestProviderStatus(testProvider, LocationProvider.AVAILABLE, null, System.currentTimeMillis());

    Location location = new Location(testProvider);
    location.setLatitude(1.0);
    location.setLongitude(2.0);
    location.setTime(System.currentTimeMillis());
    lm.setTestProviderLocation(testProvider, location);

    Assert.assertFalse("Received Location is null", received == null );

    lm.removeTestProvider(testProvider);
}
@Override
public void onLocationChanged(Location location) {
    received = location;
    Log.d("LocationTest0", "onLocationChanged CALLED");
    // Never gets called
}
4

6 に答える 6

5

これは私のために働いたものです

locationManager.addTestProvider(mocLocationProvider, false, false,
                    false, false, true, true, true, 0, 5);
locationManager.setTestProviderEnabled(mocLocationProvider, true);

.

Location mockLocation = new Location(mocLocationProvider); // a string
mockLocation.setLatitude(location.getLatitude());  // double 
mockLocation.setLongitude(location.getLongitude()); 
mockLocation.setAltitude(location.getAltitude()); 
mockLocation.setTime(System.currentTimeMillis()); 
locationManager.setTestProviderLocation( mocLocationProvider, mockLocation); 

.

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">

また、Androidフォンの設定で、「モックロケーションを許可する」チェックボックスがオンになっていることを確認してください

于 2011-05-16T09:16:18.090 に答える
2

私は同じ問題を抱えていて、それを機能させることができました。他の誰かに役立つ場合に備えて、ここで共有します。

考慮すべきことは、 へsetTestProviderLocationの呼び出しは、呼び出し時にモック プロバイダーに登録されているすべてのリスナーを呼び出すことです。そのためsetTestProviderLocation、その call の直後に呼び出したrequestLocationUpdates場合、onLocationChangedコールバックは呼び出されません。

私の問題は、これら 2 つの (setTestProviderLocationrequestLocationUpdates) が 2 つの異なるスレッドにありrequestLocationUpdates、後で呼び出されたため、 へのコールバックが得られなかったことonLocationChangedです。プログラムがマルチスレッド化されている場合 (可能性が非常に高い)、setTestProviderLocationが後に呼び出されることを確認してrequestLocationUpdatesください。

setTestProviderLocationまた、 への呼び出しで、onLocationChangedが (およそ) 1 回呼び出されることに気付きました。したがってsetTestProviderLocation、一連の への呼び出しをシミュレートするためにループを挿入できますonLocationChanged。このようにして、パスもシミュレートできます。

于 2015-08-02T21:42:13.513 に答える
1

私も同じ問題を抱えていました。それを解決できなかったので、最後にあきらめて手動でonLocationChanged( location)afterへの呼び出しを追加しました。locationManager.setTestProviderEnabled( PROVIDER, location)きれいではありませんが、機能します。

于 2013-10-16T19:46:37.943 に答える
0

同様の問題に遭遇しました。何を試しても、onLocationChanged() が自動的に呼び出されることはありませんでした。結局、あきらめて、setTestProviderLocation() で場所を設定し、直接 onLocationChanged() を呼び出すメソッドを作成しました。これは完璧な解決策ではありませんが、私のニーズには合っていました。

于 2011-10-14T18:23:22.557 に答える
0

プロバイダーを追加して有効にしたら、次の行を使用して更新を取得します。
locationManager.requestLocationUpdates(MOCK_PROVIDER, 0, 0, this);

アクティビティの開始時に次のような方法を使用することをお勧めします。

    private void enableProvider() {
        
        try {
            locationManager.addTestProvider(
                    MOCK_PROVIDER,
                    false,
                    false,
                    false,
                    false,
                    true,
                    true,
                    true,
                    0,
                    5
            );
        } catch (IllegalArgumentException | SecurityException e) {
            Log.w(TAG, "addTestProvider" + e.getMessage());
        }
        try {
            locationManager.setTestProviderEnabled(MOCK_PROVIDER, true);
            locationManager.requestLocationUpdates(MOCK_PROVIDER, 0, 0, this); <-- Update Request
        } catch (IllegalArgumentException | SecurityException e) {
            Log.w(TAG, "setTestProviderEnabled" + e.getMessage());
        }
    }

例外も処理します。

于 2020-08-05T05:45:01.213 に答える
-1

私はこの問題で同じ問題を抱えています、私は問題がTestProviderであると思うので、私は設定しました

String mocLocationProvider= LocationManager.NETWORK_PROVIDER;

その後、を呼び出すことができますonLocationChanged()

于 2012-10-28T17:51:31.487 に答える