Переключение между сетью и провайдером GPS

Я хочу реализовать locationListener, который будет переключаться между сетью и поставщиками GPS в зависимости от доступности.

Например, если GPS не включен, я хочу, чтобы он использовал сеть, но как только GPS включен, я хочу, чтобы он прекратил прослушивание обновлений местоположения из сети и начал слушать с GPS.

Аналогично, я хочу, чтобы он начал прослушивать обновления из сети, как только GPS отключен.

Возможно ли это?


подвопрос

Является ли GPS столь же быстрым, как сеть при обеспечении исправления местоположения?


Ответ 1

Конечно, вы просто получаете провайдеров для сети и GPS и проходите в зависимости от того, что вы хотите locationManager.requestLocationUpdates().

Если вы хотите прекратить прослушивание определенного провайдера, вызовите locationManager.removeUpdates() с объектом прослушивателя, указанным в locationManager.requestLocationUpdates().

Сеть:

Criteria crit = new Criteria();
crit.setPowerRequirement(Criteria.POWER_LOW);
crit.setAccuracy(Criteria.ACCURACY_COARSE);
String provider = locationManager.getBestProvider(crit, false);

GPS:

Criteria crit2 = new Criteria();
crit2.setAccuracy(Criteria.ACCURACY_FINE);
provider2 = locationManager.getBestProvider(crit2, false);

Вы можете использовать LocationManager.isProviderEnabled() doc, чтобы узнать, включен или отключен соответствующий провайдер. Там больше информации, доступной в документах LocationManager.

GPS обычно намного медленнее, чем сеть, так как вам нужно найти 3+ отдаленных спутника и т.д.

Ответ 2

Я использую этот

LocationManager locationManager;
LocationListener locationListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    locationManager = (LocationManager) this
            .getSystemService(Context.LOCATION_SERVICE);
    String locationProvider = LocationManager.NETWORK_PROVIDER;
    Location lastKnownLocation = locationManager
            .getLastKnownLocation(locationProvider);
    if (lastKnownLocation == null) {
        locationProvider = LocationManager.GPS_PROVIDER;
        lastKnownLocation = locationManager
                .getLastKnownLocation(locationProvider);
    }
    if (lastKnownLocation != null) {
        makeUseOfNewLocation(lastKnownLocation);
    }
    locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            makeUseOfNewLocation(location);
        }

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

        public void onProviderEnabled(String provider) {
        }

        public void onProviderDisabled(String provider) {
        }
    };

    // Register the listener with the Location Manager to receive location
    // updates
    if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        locationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, 0, 0, locationListener);
    } else {
        locationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
    }
}