【问题标题】:Why isn't Android's onProviderEnabled() method being called?为什么不调用 Android 的 onProviderEnabled() 方法?
【发布时间】:2011-09-22 00:15:50
【问题描述】:

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

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

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

更新...

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

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

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

类似问题: Location service onProviderEnabled never called

打开位置设置页面的按钮代码...

        //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

【问题讨论】:

  • 你在哪里调用 createLocListeners()?
  • 从 oncreate() 调用

标签: android locationmanager


【解决方案1】:

IMO,当您进入设置时,onPause() 被调用并且监听器被取消注册。然后您启用 GPS 并返回您的活动。因此,当您注册侦听器时,GPS 已经启用,因此永远不会调用侦听器 onProviderEnabled(),因为它仅在 GPS 状态更改为启用时调用。

【讨论】:

  • 这对我来说很有意义,除了为什么 onProviderDisabled() 仍然会被调用?
  • 嗯,这很好奇。如果您禁用 GPS,然后等待一分钟再返回应用,是否会发生这种情况?
  • 是的,它确实如此,(因为监听器在 onPause() 中取消注册),我想实际上比 onProviderEnabled() 没有被调用更奇怪!根据我的阅读,注册位置监听器的普遍接受的地方是 onResume() 并在 onPause 中取消注册。越想这个问题,onResume 和 onPause 好像都是不合适的地方……
  • 我想我明白了。在我的代码中,离开活动调用 onPause() 并取消注册监听器。位置服务由用户启用或禁用。返回活动调用 onResume() 并通过调用 requestLocationUpdates() 再次注册侦听器。但是,根据文档,如果从已禁用的提供程序调用 requestLocationUpdates,则会立即调用 onProviderDisabled。 (相比之下 onProviderEnabled() 不会立即调用。)developer.android.com/reference/android/location/…
  • 啊,很棒的发现。一定要记住这一点。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 2018-03-26
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多