Почему не вызывается метод Android onProviderEnabled ()? - PullRequest
8 голосов
/ 22 сентября 2011

В моем приложении для 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 ]

13 голосов
/ 29 сентября 2011

IMO, при переходе в настройки вызывается onPause() и слушатели не регистрируются.Затем вы включаете GPS и возвращаетесь к своей активности.Поэтому, когда вы регистрируете слушателей, GPS уже включен, так что слушатель onProviderEnabled() никогда не вызывается, поскольку он вызывается только тогда, когда статус GPS изменен на включен.

1 голос
/ 23 июля 2015

У меня было mLocationManager.removeUpdates(this) в onStop(), когда мне звонили, когда я открывал лоток уведомлений, чтобы включить службы определения местоположения.Поэтому, хотя я включаю локации, мой onProviderEnabled() не вызывали.Спасибо за подсказку @ Питер.

...