web-dev-qa-db-ja.com

GPSがオン/オフになったときにブロードキャストレシーバーをトリガーするにはどうすればよいですか?

public class BootReceiver extends BroadcastReceiver  {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().matches("Android.location.PROVIDERS_CHANGED")) {
            Toast.makeText(context, "in Android.location.PROVIDERS_CHANGED",
                Toast.LENGTH_SHORT).show();
            Intent pushIntent = new Intent(context, LocalService.class);
            context.startService(pushIntent);
        } else {
            Toast.makeText(context, "not in Android.location.PROVIDERS_CHANGED",
                Toast.LENGTH_SHORT).show();
            Intent pushIntent = new Intent(context, LocalService.class);
            context.startService(pushIntent);
        }
    }

    @Override
    public void onLocationChanged(Location arg0) {

    }
}

私のアプリでは、GPSがオン/オフになったときにブロードキャストレシーバーをトリガーする必要があります。問題を調査し、アプリに実装するのに最適なものを提案します。

40
Teekam

これは、ユーザーがオン/オフの場所をオンにするときにアクションをトリガーする場合に役立ちます

マニフェストにこのアクションを追加する必要があります

<action Android:name="Android.location.PROVIDERS_CHANGED" />

このアクションを追加した後、ブロードキャストレシーバーをトリガーできます

<receiver Android:name=".GpsLocationReceiver">
    <intent-filter>
        <action Android:name="Android.location.PROVIDERS_CHANGED" />
        <category Android:name="Android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>

そして、あなたのBroadcastReceiverクラスでは、以下で与えられるそのクラスにLocationListenerを実装する必要があります。

public class GpsLocationReceiver extends BroadcastReceiver {        
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().matches("Android.location.PROVIDERS_CHANGED")) {
            Toast.makeText(context, "in Android.location.PROVIDERS_CHANGED",
            Toast.LENGTH_SHORT).show();
            Intent pushIntent = new Intent(context, LocalService.class);
            context.startService(pushIntent);
        }
    }
}
71
Deepak Gupta

@ Deepak Guptaanswer を追加します。あなたのfragmentまたはactivityGPSステータスが変更されたとき。

アクティビティまたはフラグメントにブロードキャストレシーバーを以下のように登録します。

private BroadcastReceiver gpsReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().matches(LocationManager.PROVIDERS_CHANGED_ACTION)) {
            //Do your stuff on GPS status change
        }
    }
};

fragmentの場合:

getContext().registerReceiver(gpsReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION));

activityの場合:

registerReceiver(gpsReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION));

これは、アクティビティまたはフラグメントの内部だけでなく、コンテキストにアクセスできる任意の場所で使用できます。私はそれが助けてくれることを願っています。

31
pRaNaY

ユーザー@DanielNugentが指摘したように、このコードを試すことができます。

    ContentResolver contentResolver = getContext().getContentResolver();
    // Find out what the settings say about which providers are enabled
    int mode = Settings.Secure.getInt(
            contentResolver, Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);

    if (mode != Settings.Secure.LOCATION_MODE_OFF) {
      if (mode == Settings.Secure.LOCATION_MODE_HIGH_ACCURACY) {
        locationMode = "High accuracy. Uses GPS, Wi-Fi, and mobile networks to determine location";
      } else if (mode == Settings.Secure.LOCATION_MODE_SENSORS_ONLY) {
          locationMode = "Device only. Uses GPS to determine location";
      } else if (mode == Settings.Secure.LOCATION_MODE_BATTERY_SAVING) {
          locationMode = "Battery saving. Uses Wi-Fi and mobile networks to determine location";
      }
    }
13
IgorGanapolsky

Android Androidでロケーションモードが導入された後の有効なソリューション

より正確な位置情報モードで確認できます

private boolean isGpsEnabled(Context context) {
            ContentResolver contentResolver = getContext().getContentResolver();
            // Find out what the settings say about which providers are enabled
            //  String locationMode = "Settings.Secure.LOCATION_MODE_OFF";
            int mode = Settings.Secure.getInt(
                    contentResolver, Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
            if (mode != Settings.Secure.LOCATION_MODE_OFF) {
                return true;
               /* if (mode == Settings.Secure.LOCATION_MODE_HIGH_ACCURACY) {
                    locationMode = "High accuracy. Uses GPS, Wi-Fi, and mobile networks to determine location";
                } else if (mode == Settings.Secure.LOCATION_MODE_SENSORS_ONLY) {
                    locationMode = "Device only. Uses GPS to determine location";
                } else if (mode == Settings.Secure.LOCATION_MODE_BATTERY_SAVING) {
                    locationMode = "Battery saving. Uses Wi-Fi and mobile networks to determine location";
                }*/
            } else {
                return false;
            }
        }
0
Vinayak