Android 根据可用性在gps和网络提供商之间切换

Android 根据可用性在gps和网络提供商之间切换,android,geolocation,gps,gsm,Android,Geolocation,Gps,Gsm,这是我的代码片段,我的问题是,一旦应用程序安装时打开了GPS,那么一旦我们关闭GPS,它就不会切换到GSM获取位置,反之亦然 因此,请告诉我一种方法,根据位置提供商的可用性,在GPS和GSM之间高效切换 注意:我的应用程序是一项服务 谢谢 编辑:我有一个BroadcastReceiver,这就是为什么我假设一旦GPS打开/关闭,onCreate()将被调用 我还尝试在onLocationChanged(位置)中检查提供程序的可用性。 但这没用 编辑:我修改了我的onProviderDisable

这是我的代码片段,我的问题是,一旦应用程序安装时打开了GPS,那么一旦我们关闭GPS,它就不会切换到GSM获取位置,反之亦然

因此,请告诉我一种方法,根据位置提供商的可用性,在GPS和GSM之间高效切换

注意:我的应用程序是一项服务

谢谢

编辑:我有一个BroadcastReceiver,这就是为什么我假设一旦GPS打开/关闭,onCreate()将被调用

我还尝试在onLocationChanged(位置)中检查提供程序的可用性。 但这没用

编辑:我修改了我的onProviderDisabled和onProviderEnabled,如下所示, 请告诉我我做错了什么

public void onCreate() {
 locationListener = new GeoUpdateHandler();
 locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

try {
   gps_enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
   network_enabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch (Exception ex) { 
}

if(gps_enabled) {
       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, TIME_DURATION, 100, locationListener);
} else if(network_enabled) { // Checking for GSM
   locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, TIME_DURATION, DISTANCE, locationListener);
}   
}   
public class GeoUpdateHandler implements LocationListener {
private void getPresentLocation(Location location) {
    ... 
            //Fetch the locations
            ...
}

@Override
public void onProviderDisabled(String provider) { }

@Override
public void onProviderEnabled(String provider) { }

@Override
public void onStatusChanged(String provider, int status, Bundle extras) { }

@Override
public void onLocationChanged(Location location) {
    getPresentLocation(location);
}
}

看起来您只是在onCreate()方法中请求位置更新。一旦提供商更改,您必须向新提供商请求更新,否

安卓博客上有一篇关于位置的帖子,内容还包括监控提供商的变化:


找到了解决方案:

    public void onProviderDisabled(String provider) {
        locationManager.removeUpdates(locationListener);
        if (provider.toLowerCase().equals(LocationManager.GPS_PROVIDER)) {
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, TIME_DURATION, 1, locationListener);               
        } else {
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, TIME_DURATION, 1, locationListener);
        }   
    }

    @Override
    public void onProviderEnabled(String provider) {
        locationManager.removeUpdates(locationListener);
        if (provider.toLowerCase().equals(LocationManager.GPS_PROVIDER)) {
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, TIME_DURATION, 1, locationListener);
        } else {
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, TIME_DURATION, 1, locationListener);
        }

    }
我错过的是 locationManager=(locationManager)getSystemService(Context.LOCATION\u服务) 在onProviderEnabled()和onProviderDisabled()中


谢谢

是的,我在这里发现了另一个问题,我的onProviderEnabled()没有被调用。
 public void onProviderDisabled(String provider) {
   locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
   if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,  locationListener);
   } else {
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
   } 
}

@Override
public void onProviderEnabled(String provider) {
  locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);   
  if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
  } else {
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
  }
}