8

私のAndroidアプリには、2つのロケーションリスナーがあります。1つはファインリスニング用、もう1つはコースリスニング用です。ユーザーが位置情報サービスをオフまたはオンにしたときを検出できるようにしたい。

電話のGPSまたはネットワーク位置情報サービスをオフにすると、期待どおりにonProviderDisabledメソッドが呼び出されます。GPSまたはネットワークサービスをオンにすると、onProviderEnabledが呼び出されません。

リスナーの1人のコードを以下に示します。

アップデート...

この問題は、onPauseでリスナーの登録を解除することに関連していることがわかりました。コード「locationManager.removeUpdates(myFineLocationListener);」を削除すると onProviderEnabled()メソッドが呼び出されます。

おそらく、(たとえば)GPSを無効にする行為は、リスナーの登録を自動的に解除しますか?おそらく、onPause()ではなくonDestroyでリスナーの登録を解除する必要があります???

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
4

2 に答える 2

14

IMO、設定に移動すると、onPause()が呼び出され、リスナーの登録が解除されます。次に、GPSを有効にして、アクティビティに戻ります。したがって、リスナーを登録すると、GPSはすでに有効になっているため、リスナーは呼び出されません。これは、GPSステータスが有効に変更さonProviderEnabled()れた場合にのみ呼び出されるためです。

于 2011-09-28T22:11:42.553 に答える
1

通知トレイをプルダウンしてロケーションサービスをオンにしたときに、電話がかかってきましたmLocationManager.removeUpdates(this)onStop()そのため、場所をオンにしても、onProviderEnabled()電話がかかってきませんでした。ヒント@Peterをありがとう。

于 2015-07-23T13:20:45.437 に答える