8

我的 Android 应用程序有两个位置侦听器,一个用于精细侦听,一个用于粗略侦听。我希望能够检测到用户何时关闭和打开他们的位置服务。

每当我关闭手机 GPS 或网络定位服务时,onProviderDisabled 方法就会按预期调用。当我打开 GPS 或网络服务时,永远不会调用 onProviderEnabled!

我已将其中一位听众的代码放在下面....

更新...

我发现问题与取消注册 onPause 中的侦听器有关。当我删除代码“locationManager.removeUpdates(myFineLocationListener);” 调用了 onProviderEnabled() 方法。

也许禁用(比如说)GPS 的行为会自动取消注册听众?也许我应该在 onDestroy 而不是 onPause() 中注销 thje 监听器???

PS。也许我提到我的活动有一个直接进入设备位置设置页面的按钮是相关的。它充当快捷方式。我使用此快捷方式禁用/启用位置服务,然后使用返回按钮返回我的应用程序。我将把这个按钮的代码放在这篇文章的最后。

代码:

(从 onCreate() 调用 createLocListeners() 方法;)

 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
4

2 回答 2

14

IMO, when you go to settings the onPause() is called and listeners are unregistered. Then you enable the GPS and return to your activity. So when you register the listeners the GPS is already enabled, so listener onProviderEnabled() is never called, since it is only called when GPS status is changed to enabled.

于 2011-09-28T22:11:42.553 回答
1

当我拉下通知托盘以打开位置服务时,我在其中被调用mLocationManager.removeUpdates(this)onStop()因此,尽管我打开了这些位置,但我onProviderEnabled()并没有被叫到。感谢@Peter 的提示。

于 2015-07-23T13:20:45.437 回答