Comment peut-on détecter le mode avion sur Android?

J’ai un code dans mon application qui détecte si le Wi-Fi est activement connecté. Ce code déclenche une exception RuntimeException si le mode avion est activé. J’aimerais quand même afficher un message d’erreur distinct dans ce mode. Comment puis-je détecter de manière fiable si un appareil Android est en mode avion?

/** * Gets the state of Airplane Mode. * * @param context * @return true if enabled. */ private static boolean isAirplaneModeOn(Context context) { return Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0; } 

En étendant la réponse d’Alex pour inclure la vérification de la version du SDK, nous avons:

 /** * Gets the state of Airplane Mode. * * @param context * @return true if enabled. */ @SuppressWarnings("deprecation") @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) public static boolean isAirplaneModeOn(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { return Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0; } else { return Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; } } 

Et si vous ne souhaitez pas interroger si le mode avion est actif ou non, vous pouvez enregistrer un BroadcastReceiver pour l’intention SERVICE_STATE et y réagir.

Soit dans votre ApplicationManifest:

      

ou par programmation:

 IntentFilter intentFilter = new IntentFilter("android.intent.action.AIRPLANE_MODE"); BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d("AirplaneMode", "Service state changed"); } }; context.registerReceiver(receiver, intentFilter); 

Et comme décrit dans les autres solutions, vous pouvez interroger le mode avion lorsque votre récepteur a été averti et lancer votre exception.

Lors de l’enregistrement du BroadcastReceiver mode avion (réponse @saxos), je pense qu’il est tout à fait logique d’obtenir l’état du paramètre de mode avion directement dans les options supplémentaires afin d’éviter d’appeler Settings.Global ou Settings.System :

 @Override public void onReceive(Context context, Intent intent) { boolean isAirplaneModeOn = intent.getBooleanExtra("state", false); if(isAirplaneModeOn){ // handle Airplane Mode on } else { // handle Airplane Mode off } } 

De là :

  public static boolean isAirplaneModeOn(Context context){ return Settings.System.getInt( context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0; } 

pour se débarrasser de la plainte de dépréciation (en ciblant API17 + et ne pas trop se soucier de la compatibilité descendante), il faut comparer avec Settings.Global.AIRPLANE_MODE_ON :

 /** * @param Context context * @return boolean **/ private static boolean isAirplaneModeOn(Context context) { return Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0); } 

en considérant API inférieure:

 /** * @param Context context * @return boolean **/ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @SuppressWarnings({ "deprecation" }) private static boolean isAirplaneModeOn(Context context) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1){ /* API 17 and above */ return Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; } else { /* below */ return Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0; } } 

Récepteur de diffusion statique

Code manifeste:

      

Code Java: fichier java de Receiver de diffusion

 if(Settings.System.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0)== 0) { Toast.makeText(context, "AIRPLANE MODE Off", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(context, "AIRPLANE MODE On", Toast.LENGTH_SHORT).show(); } 

OU

Récepteur de diffusion dynamic

Code Java: fichier d’activité java

Enregistrer le récepteur de diffusion sur l’application inutile d’append du code dans le manifeste si vous effectuez une action uniquement lorsque votre activité est ouverte, par exemple que le mode avion est activé ou désactivé lorsque vous accédez à Internet, etc.

 airplanemodecheck reciver; @Override protected void onResume() { super.onResume(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); reciver = new airplanemodecheck(); registerReceiver(reciver, intentFilter); } @Override protected void onStop() { super.onStop(); unregisterReceiver(reciver); } 

Code Java: fichier java de Receiver de diffusion

 if(Settings.System.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0)== 0) { Toast.makeText(context, "AIRPLANE MODE Off", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(context, "AIRPLANE MODE On", Toast.LENGTH_SHORT).show(); } 

A partir du niveau API – 17

 /** * Gets the state of Airplane Mode. * * @param context * @return true if enabled. */ private static boolean isAirplaneModeOn(Context context) { return Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; } 

Dans Oreo, veuillez ne pas utiliser le mode avion largeCastReceiver. c’est une intention implicite. il a été enlevé. Voici la liste des exceptions en cours. sa ne figure pas actuellement sur la liste et ne devrait donc pas recevoir de données. Considérez cela comme mort.

comme indiqué par un autre utilisateur ci-dessus, utilisez le code suivant:

  @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @SuppressWarnings({ "deprecation" }) public static boolean isAirplaneModeOn(Context context) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1){ /* API 17 and above */ return Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; } else { /* below */ return Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0; } } 

J’ai écrit cette classe qui pourrait être utile. Il ne renvoie pas directement un booléen pour vous indiquer si le mode avion est activé ou désactivé, mais il vous avertira lorsque le mode avion sera changé de l’un à l’autre.

 public abstract class AirplaneModeReceiver extends BroadcastReceiver { private Context context; /** * Initialize tihe reciever with a Context object. * @param context */ public AirplaneModeReceiver(Context context) { this.context = context; } /** * Receiver for airplane mode status updates. * * @param context * @param intent */ @Override public void onReceive(Context context, Intent intent) { if(Settings.System.getInt( context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0 ) == 0) { airplaneModeChanged(false); } else { airplaneModeChanged(true); } } /** * Used to register the airplane mode reciever. */ public void register() { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); context.registerReceiver(this, intentFilter); } /** * Used to unregister the airplane mode reciever. */ public void unregister() { context.unregisterReceiver(this); } /** * Called when airplane mode is changed. * * @param enabled */ public abstract void airplaneModeChanged(boolean enabled); } 

Usage

 // Create an AirplaneModeReceiver AirplaneModeReceiver airplaneModeReceiver; @Override protected void onResume() { super.onResume(); // Initialize the AirplaneModeReceiver in your onResume function // passing it a context and overriding the callback function airplaneModeReceiver = new AirplaneModeReceiver(this) { @Override public void airplaneModeChanged(boolean enabled) { Log.i( "AirplaneModeReceiver", "Airplane mode changed to: " + ((active) ? "ACTIVE" : "NOT ACTIVE") ); } }; // Register the AirplaneModeReceiver airplaneModeReceiver.register(); } @Override protected void onStop() { super.onStop(); // Unregister the AirplaneModeReceiver if (airplaneModeReceiver != null) airplaneModeReceiver.unregister(); } 

Voici la seule chose qui a fonctionné pour moi (API 27):

 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); this.registerReceiver(br, filter); 

br est votre BroadcastReceiver. Je crois qu’avec les modifications récentes de la permission maintenant, ConnectivityManager.CONNECTIVITY_ACTION et Intent.ACTION_AIRPLANE_MODE_CHANGED sont nécessaires.

Vous pouvez vérifier si Internet est activé

 public class ConnectionDetector { private Context _context; public ConnectionDetector(Context context){ this._context = context; } public boolean isConnectingToInternet(){ ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity != null) { NetworkInfo[] info = connectivity.getAllNetworkInfo(); if (info != null) for (int i = 0; i < info.length; i++) if (info[i].getState() == NetworkInfo.State.CONNECTED) { return true; } } return false; } 

}