Android LocationProvider测试不会触发onLocationChanged()

时间:2015-03-23 21:54:07

标签: android gps locationmanager android-testing

我试图在Android中测试GPS,所以我遵循了这些建议Testing GPS in Android

我的MainActivity课程是这样的:

public class MainActivity extends Activity implements LocationListener {
...
private LocationManager locationManager;
...

protected void onCreate(Bundle savedInstanceState) {
    ...
    this.locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    ...
}

...

protected void onResume() {
    ...
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    this.locationManager.requestLocationUpdates(Constants.GEOPOSITIONING_UPDATE_PERIOD,Constants.GEOPOSITIONING_UPDATE_DISTANCE, criteria, this, null);
    ...
}

...

public LocationManager getLocationManager() {
    return this.locationManager;
}

...
}

我的测试类是这样的:

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
...
@UiThreadTest
public void test001() {
    LocationManager locationManager = null;

    try {
        MainActivity mainActivity = getActivity();

        locationManager = mainActivity.getLocationManager();
        locationManager.addTestProvider("Test", false, false, false, false, true, true, true, 0, 5);
        locationManager.setTestProviderEnabled("Test", true);

        Location location = new Location("Test");
        location.setLatitude(10.0);
        location.setLongitude(20.0);
        location.setAltitude(0);
        location.setTime(System.currentTimeMillis());
        location.setElapsedRealtimeNanos(System.currentTimeMillis());
        location.setAccuracy(Criteria.ACCURACY_FINE);
        locationManager.setTestProviderLocation("Test", location);

        ...
    } finally {
        if (locationManager != null) {
            locationManager.removeTestProvider("Test");
        }
    }
}

...
}

但即使在致电onLocationChanged之后,也永远不会调用MainActivity的{​​{1}}。

PS:我在清单中使用setTestProviderLocation权限。

2 个答案:

答案 0 :(得分:0)

我写了我发现的here,查看它,它也可以帮到你。

另外,我注意到你正在使用&#34;测试&#34;作为您的测试提供商,但在您的活动中,您会根据条件使用requestLocationUpdates。这是另一个问题。您需要确保模拟您所在位置的提供商与您的应用程序期望从中接收回调的提供商相同。

因此,如果您的活动正在等待gps提供商的位置,则您无法模拟Test提供商处的位置,并希望在活动中收到这些位置。

希望它有所帮助。

答案 1 :(得分:0)

替换&#34;测试&#34;通过LocationManager.GPS_PROVIDER或LocationManager.NETWORK_PROVIDER,具体取决于您要模拟的那个。