Переключение между сетью и провайдером 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);
}
}