Переключение между gps и сетевым провайдером в зависимости от доступности - PullRequest
5 голосов
/ 28 декабря 2011
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);
}
}

это мой фрагмент кода, и моя проблема в том, что как только приложение установлено с включенным GPS, оно не переключается на GSM для получения местоположения после отключения GPS, и наоборот.

Итак, скажите, пожалуйста, как эффективно переключаться между GPS и GSM в зависимости от наличия услуг определения местоположения.

ПРИМЕЧАНИЕ. Мое приложение - это служба.

Спасибо.

Редактировать: я получил BroadcastReceiver, поэтому я предполагаю, что onCreate () будет вызываться после включения / выключения GPS.

Я также пытался проверить доступность поставщика в onLocationChanged (Location location). Но это не помогло.

РЕДАКТИРОВАТЬ: я изменил свой onProviderDisabled и onProviderEnabled, как это, Пожалуйста, расскажите, что я делаю не так здесь ..

    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);
        }

    }

Ответы [ 2 ]

5 голосов
/ 03 января 2012

Есть решение для этого:

 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);
  }
}

что я пропустил locationManager = (LocationManager) getSystemService (Context.LOCATION_SERVICE); в onProviderEnabled () и onProviderDisabled ().

Спасибо

0 голосов
/ 29 декабря 2011

Похоже, вы запрашиваете только обновления местоположения в методе onCreate ().Когда провайдеры меняются, вы должны запрашивать обновления у нового провайдера, нет?

Вот сообщение в блоге Android о местоположениях, оно также охватывает изменения поставщика мониторинга:

http://android -developers.blogspot.com / 2011/06 / deep-dive-into-location.html

...