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?
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.
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").
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.
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 .
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);
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.
À 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