Android中的LocationManager具有3个提供程序,但是当我的LocationManager也显示MOCK_PROVIDER时

时间:2018-11-27 20:28:04

标签: java android locationmanager

我正在开发基于位置的Android应用。为了测试LocationListener接口的onLocationChanged(),我创建了一个MockLocationProvider类,该类将一个名为MOCK_PROVIDER的测试提供程序添加到位置管理器实例中。在我的代码中添加MockLocationProvider类之前,位置管理器实例仅显示3个提供程序-GPS,Network和Passive。但是,当我运行代码以使用MockLocationProvider时,位置管理器实例将显示4个提供程序-GPS,网络,被动和MOCK_PROVIDER。因此,在将测试提供程序添加到位置管理器实例时,它抛出异常,表明MOCK_PROVIDER已经存在。我还创建了一个关闭方法,该方法将在应用程序终止时删除MOCK_PROVIDER。我不知道为什么MOCK_PROVIDER仍然存在于我的位置管理器实例中。现在,即使我不使用MockLocationProvider,位置管理器仍会显示4个提供程序。请告诉我为什么这是奇怪的行为。我做错什么了吗?

以下是MockLocationProvider类的代码段:

public class MockLocationProvider {

    private String providerName;
    private Context context;
    private LocationManager locationManager;

    public MockLocationProvider(LocationManager manager, String name, Context ctx) {
        providerName = name;
        context = ctx;

        locationManager = manager;
        for(String provider: locationManager.getAllProviders()) {
            System.out.println("provider: " + provider);
        }
        locationManager.addTestProvider(providerName, false,false, false,
            false, true, true, true, 0, 5);
        locationManager.setTestProviderEnabled(providerName, true);
    }

    public void pushLocation(double latitude, double longitude) {
        Location mockLocation = new Location(providerName);
        mockLocation.setLatitude(latitude);
        mockLocation.setLongitude(longitude);
        mockLocation.setAltitude(0);
        mockLocation.setAccuracy(1);
        mockLocation.setElapsedRealtimeNanos(1000);
        mockLocation.setTime(System.currentTimeMillis());
        locationManager.setTestProviderLocation(providerName, mockLocation);
    }

    public void shutdown() {
        locationManager.clearTestProviderEnabled(providerName);
        locationManager.removeTestProvider(providerName);
    }
}

以下是LocationService服务的onDestroy()代码,我们应该对其进行覆盖:

@Override
public void onDestroy() {
    stopForeground(true);

    if(mockLocationProvider != null) mockLocationProvider.shutdown();
    if(mLocationManager != null && mLocationListener != null){
        mLocationManager.removeUpdates(mLocationListener);
    }
    super.onDestroy();
}

0 个答案:

没有答案