10

ユーザーがネットワークまたは GPS の場所を有効または無効にしたときに通知を受け取りたいのですが、重要なのは、それらがどの場所をどのように変更したかを知りたいということです。ブロードキャスト インテント用のブロードキャスト レシーバーがありandroid.location.PROVIDERS_CHANGED、これは正しいブロードキャストを受信して​​います。

ここで、どのアクションが発生したか、つまり、有効化または無効化され、どのプロバイダーが変更されたかを判断する必要があります。各プロバイダーの状態を保持できることを知っており、プロバイダーが変更されたという通知を受け取ったときに、何が変更されたかを判断できます。これを行うためのより「標準的な」方法を探しています。ブロードキャスト インテントには、どのプロバイダーが変更されたかを示す余分なものがないようです。

これは私が現在持っているコードです。

    public class LocationProviderChangedReceiver extends BroadcastReceiver {
    private final static String TAG = "LocationProviderChangedReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
      if (intent.getAction().matches("android.location.PROVIDERS_CHANGED"))
      {
        Log.i(TAG,"Location Providers changed");
        Bundle bundle = intent.getExtras();
        if (bundle == null) {
          Log.d(TAG, "No extras data");
         } else {
           Log.d(TAG, "Bundle received of size " + bundle.size);
         } 
      }
    }
  }

これは私のマニフェストからの抜粋です

  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

  <receiver 
    android:name=".LocationProviderChangedReceiver"
    android:exported="false">
    <intent-filter>
      <action android:name="android.location.PROVIDERS_CHANGED" />
      <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
  </receiver>

ブロードキャスト内に、どのプロバイダーが変更されたか、およびそれが有効か無効かを示すエクストラがあれば、これは完璧です. 残念ながら、そうではありません。自分の状態変数を維持せずに、どの状態が変化したかを判断できるメカニズムを知っている人はいますか?

理想的な世界では、変化を常に監視し、場所の変化はたまに聞くだけです。場所の変更を常に監視することは避けたいと思います。

4

4 に答える 4

1

@usman の回答のおかげでextends、次の方法でクラスなしでソリューションを適用できます。

AndroidManifest.xml;

<receiver android:name="com.eegeo.location.LocationProviderChangedReceiver">
    <intent-filter>
        <action android:name="android.location.PROVIDERS_CHANGED" />
    </intent-filter>
</receiver>

クラス(テストしたことはありません);

public class LocationProviderChangedReceiver {

    private mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String ability = (isGPSProviderEnabled() && isNetworkProviderEnabled()) ? "CAN" : "CANNOT";
            Log.d("", "The location " + ability + " be caught in high accuracy!");
        }
    };


    public startProviderChangeObserving () {
        registerReceiver(mReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION));

    }


    public stopProviderChangeObserving () {
        unregisterReceiver(mReceiver);
    }   


    /**
    * Method to verify that the location providers wheter on or not on the device
    **/
    public boolean isGPSProviderEnabled() {
        return (Boolean) mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    }

    public boolean isNetworkProviderEnabled() {
        return (Boolean) mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    }

}
于 2016-09-08T07:40:42.980 に答える
0

レシーバーでは、有効になっているプロバイダーを簡単に確認できます。

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE)
List<String> providers = lm.getProviders(true);

このようにして、すべての有効なプロバイダーを取得します。

于 2014-09-30T11:13:03.503 に答える