web-dev-qa-db-fra.com

Comment détecter quand l'utilisateur active / désactive l'état du GPS?

Je souhaite empêcher l'utilisateur de modifier les paramètres WiFi, GPS et de chargement de mon application. L'utilisateur n'a pas besoin d'activer/désactiver le WiFi et le GPS lors de l'exécution de mon application (depuis la barre de notification). Existe-t-il BroadcastReceiver pour écouter le GPS on/off?

21
Devu Soman

Eh bien, j'ai beaucoup fouillé et j'ai trouvé que addGpsStatusListener(gpsStatusListener) était obsolète dans l'API 24. Et pour moi, cela n'a même pas fonctionné! Voici donc une autre solution alternative à cela.

Si dans votre application, vous souhaitez écouter le changement d'état du GPS (je veux dire Marche/Arrêt par l'utilisateur) . L'utilisation d'un Broadcast est sûrement la meilleure approche.

La mise en oeuvre:

/**
 * Following broadcast receiver is to listen the Location button toggle state in Android.
 */
private BroadcastReceiver mGpsSwitchStateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().matches("Android.location.PROVIDERS_CHANGED")) {
            // Make an action or refresh an already managed state.
        }
    }
};

N'oubliez pas de vous enregistrer et de vous désinscrire de manière efficace dans Fragment/Activity Lifecycle également.

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

Par exemple, si vous utilisez ceci un Fragment, enregistrez-le dans le onResume et annulez l'enregistrement dans le onDestroy. De plus, si vous dirigez l'utilisateur vers les paramètres pour activer le commutateur d'emplacement, la désinscription dans le onStop ne fonctionnera pas car, votre activité va au onPause et le fragment est arrêté.

Eh bien, il peut y avoir de nombreuses réponses à cette solution, mais celle-ci est facile à gérer et à utiliser. Proposez vos solutions le cas échéant.

32
sud007

Vous pouvez écouter l'état GPS avec un GpsStatus.Listener et l'enregistrer avec le LocationManager.

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.addGpsStatusListener(new Android.location.GpsStatus.Listener()
{
    public void onGpsStatusChanged(int event)
    {
        switch(event)
        {
        case GPS_EVENT_STARTED:
            // do your tasks
            break;
        case GPS_EVENT_STOPPED:
            // do your tasks
            break;
        }
    }
});

Vous devez avoir accès au contexte (par exemple dans une classe "Activité" ou "Application").

23
luxer

Ce n'est pas possible. Vous ne pouvez pas contrôler/restreindre l'état du matériel sur votre caprice. Ce serait dangereux d'avoir dans les API et à juste titre donc aucune telle API n'existe.

3
JoxTraex

Vous pouvez enregistrer un BroadcastReceiver pour écouter Intent Action PROVIDERS_CHANGED_ACTION. Cela sera diffusé lorsque le fournisseur d'emplacement configuré changera. Vous pouvez référer ceci lien .

2
Aju

Ecoutez LocationManager.PROVIDERS_CHANGED_ACTION événements dans la méthode onResume () de votre activité:

IntentFilter filter = new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION);
filter.addAction(Intent.ACTION_PROVIDER_CHANGED);
mActivity.registerReceiver(gpsSwitchStateReceiver, filter);

Ajoutez cette instance de BroadcastReceiver à votre activité:

private BroadcastReceiver gpsSwitchStateReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            if (LocationManager.PROVIDERS_CHANGED_ACTION.equals(intent.getAction())) {

                LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
                boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
                boolean isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

                if (isGpsEnabled || isNetworkEnabled) {
                    // Handle Location turned ON
                } else {
                    // Handle Location turned OFF
                }
            }
        }
    };

Désenregistrez le récepteur dans votre méthode onPause ():

mActivity.unregisterReceiver(gpsSwitchStateReceiver);
2
matdev

Vous pouvez détecter l'état du GPS en suivant le chemin.

Regardez GpsStatus.Listener . Enregistrez-le avec locationManager.addGpsStatusListener (gpsStatusListener).

Vérifiez également ceci SO lien pour une meilleure compréhension.

1
Rahil2952

À partir de l'API 19, vous pouvez enregistrer un BroadcastReceiver pour écouter l'action intentionnelle LocationManager.MODE_CHANGED_ACTION

Référence: https://developer.Android.com/reference/Android/location/LocationManager.html#MODE_CHANGED_ACTION

Vous pouvez obtenir le mode de localisation avec

try
{
    int locationMode = Android.provider.Settings.Secure.getInt(context.getContentResolver(), Android.provider.Settings.Secure.LOCATION_MODE);
} catch (Android.provider.Settings.SettingNotFoundException e)
{
    e.printStackTrace();
}

La valeur renvoyée doit être l'une des suivantes:

Android.provider.Settings.Secure.LOCATION_MODE_BATTERY_SAVING
Android.provider.Settings.Secure.LOCATION_MODE_HIGH_ACCURACY
Android.provider.Settings.Secure.LOCATION_MODE_OFF
Android.provider.Settings.Secure.LOCATION_MODE_SENSORS_ONLY
0
ARLabs