setTestProviderLocation()不会触发onLocationChanged()的调用

时间:2011-05-16 09:07:33

标签: android junit locationmanager

我正试图让这段代码起作用:

Testing GPS in Android

问题是,当我运行测试时,永远不会调用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
}

6 个答案:

答案 0 :(得分: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手机设置中,请确保勾选“允许模拟位置”复选框

答案 1 :(得分:2)

我遇到了同样的问题,可以让它发挥作用。我会在这里分享,以防它可以帮助其他任何人。

要考虑的是,对setTestProviderLocation的任何调用都将调用在调用时在模拟提供程序上注册的任何侦听器。因此,如果您在致电setTestProviderLocation之后拨打requestLocationUpdates,则永远不会调用onLocationChanged回调。

我的问题是我在两个不同的主题中有这两个(setTestProviderLocationrequestLocationUpdates)并且之后调用了requestLocationUpdates,所以我从未收到onLocationChanged的回调。如果您的程序是多线程的(很可能是这样),请确保在setTestProviderLocation之后调用requestLocationUpdates

此外,我注意到对setTestProviderLocation的任何调用,onLocationChanged将被调用一次(大约)。因此,您可以将setTestProviderLocation置于循环中,以模拟对onLocationChanged的一系列调用。这样你也可以模拟路径。

答案 2 :(得分:1)

我遇到了同样的问题。无法解决问题,最后我放弃并在onLocationChanged( location)之后手动添加了对locationManager.setTestProviderEnabled( PROVIDER, location)的电话。它不漂亮但是很有效。

答案 3 :(得分:0)

我遇到了类似的问题。无论我尝试了什么,我都无法自动调用onLocationChanged()。最后,我放弃了并创建了一个方法,该方法都使用setTestProviderLocation()设置位置并直接调用onLocationChanged()。这不是一个完美的解决方案,但它可以满足我的需求。

答案 4 :(得分: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());
        }
    }

还要处理异常。

答案 5 :(得分:-1)

我对此问题有同样的问题,我认为问题是TestProvider,所以我设置了

String mocLocationProvider= LocationManager.NETWORK_PROVIDER;

然后它可以调用onLocationChanged()