Почему не вызывается метод Android onProviderEnabled()?
В моем приложении для Android есть два прослушивателя местоположения: один для штрафа и один для грубого прослушивания. Я хочу иметь возможность определять, когда пользователь включает и выключает свои службы определения местоположения.
Всякий раз, когда я выключаю свои телефоны GPS или службы определения местоположения сети, метод onProviderDisabled вызывается, как и ожидалось. Когда я включаю GPS или сетевые сервисы, onProviderEnabled никогда не вызывается!
Я поместил код для одного из слушателей ниже....
Обновить...
Я обнаружил, что проблема связана с отменой регистрации слушателей в onPause. Когда я удаляю код "locationManager.removeUpdates(myFineLocationListener);" вызывается метод onProviderEnabled().
Возможно, акт отключения (скажем) GPS автоматически отменяет регистрацию слушателя? Возможно я должен отменить регистрацию слушателя в onDestroy, а не onPause ()???
PS. Может быть, уместно упомянуть, что в моей активности есть кнопка, которая идет прямо на страницу настроек местоположения устройств. Это действует как ярлык. Я использую этот ярлык, чтобы отключить / включить службы определения местоположения, а затем кнопку "Назад", чтобы вернуться в мое приложение. Я поставлю код для этой кнопки в самом конце этого поста.
Код:
(Метод createLocListeners() вызывается из onCreate();)
void createLocListeners() {
//if null, create a new listener
//myFineLocationListener is a class variable
if (myFineLocationListener == null) {
//Listen for FINE location updates
myFineLocationListener = new LocationListener(){
@Override
public void onLocationChanged(Location location) {
//Do something
}
@Override
public void onProviderDisabled(String provider) {
//This gets called when I change location settings (eg GPS on or off) on the phone }
@Override
public void onProviderEnabled(String provider) {
//This DOES NOT get called when I change location settings (eg GPS on or off) on the phone
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}; //end on location listener
} //end if fine listener is null
} //end createLocListener() function
@Override
protected void onResume() {
super.onResume();
//REGISTER LOCATION LISTENERS
try {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LISTENING_INTERVAL, LISTENING_DISTANCE, myFineLocationListener);
}
catch (IllegalArgumentException e){
//Tried catching exceptions but there weren't any
}
catch (RuntimeException e) {
}
}// end onResume()
@Override
protected void onPause() {
super.onPause();
//UNREGISTER LOCATION LISTENERS
locationManager.removeUpdates(myFineLocationListener);
} //end onPause
Аналогичная проблема: служба определения местоположения onProviderEnabled никогда не вызывается
Код кнопки, которая открывает страницу настроек местоположения...
//JUMP TO LOCATION SERVICES SETTINGS
ibLoc.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
}
}); //end jump to location services button listener
2 ответа
ИМО, когда вы идете в настройках onPause()
называется и слушатели не зарегистрированы. Затем вы включаете GPS и возвращаетесь к своей активности. Поэтому, когда вы регистрируете слушателей, GPS уже включен, так что слушатель onProviderEnabled()
никогда не вызывается, поскольку вызывается только при изменении состояния GPS на включенное.
Я имел mLocationManager.removeUpdates(this)
в onStop()
который вызывали, когда я вытащил лоток уведомлений, чтобы включить службы определения местоположения. Так что, хотя я включаю места, мой onProviderEnabled()
не звонили. Спасибо за подсказку @Peter.