web-dev-qa-db-fra.com

Comment déclencher le récepteur de diffusion lorsque le GPS est activé/désactivé?

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) {

    }
}

Dans mon application, je dois activer le récepteur de diffusion lorsque le GPS est activé/désactivé . examiner la question et suggérer le meilleur à mettre en œuvre dans l'application.

35
Teekam

Ceci est utile lorsque l’utilisateur souhaite déclencher une action sur l’emplacement activé/désactivé.

Vous devez ajouter cette action dans le manifeste

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

et après avoir ajouté cette action, vous pouvez déclencher votre récepteur de diffusion 

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

Et dans votre classe BroadcastReceiver, vous devez implémenter LocationListener dans la classe donnée ci-dessous.

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);
        }
    }
}
68
Deepak Gupta

Je souhaite ajouter @Deepak Guptaanswer . Je souhaite ajouter du code expliquant comment enregistrer un récepteur de brodacsast dynamique dans votre fragment ou activity lorsque l'état du GPS change. .

Enregistrez votre récepteur de radiodiffusion comme ci-dessous dans votre activité ou votre fragment. 

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
        }
    }
};

Pour fragment:

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

Pour activité:

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

Ceci peut être utilisé à tout endroit où vous avez accès à un contexte, pas seulement à l'intérieur d'une activité ou d'un fragment. J'espère que ça aide.

27
pRaNaY

Vous pouvez essayer ce code, comme l'utilisateur @DanielNugent l'a souligné:

    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

Solution opérationnelle après l'introduction des modes de localisation Android dans Android

Nous pouvons vérifier avec le mode de localisation pour plus précis

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