¿Cómo se puede detectar el modo avión en Android?

Tengo código en mi aplicación que detecta si Wi-Fi está activamente conectado. Ese código activa una excepción RuntimeException si el modo de avión está habilitado. Me gustaría mostrar un mensaje de error separado cuando en este modo de todos modos. ¿Cómo puedo detectar de forma fiable si un dispositivo Android está en modo avión?

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

Extendiendo la respuesta de Alex para incluir la verificación de la versión del SDK tenemos:

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

Y si no desea hacer sondeos si el modo Avión está activo o no, puede registrar un BroadcastReceiver para la intención SERVICE_STATE y reaccionar sobre él.

Ya sea en su ApplicationManifest:

 <receiver android:enabled="true" android:name=".ConnectivityReceiver"> <intent-filter> <action android:name="android.intent.action.AIRPLANE_MODE"/> </intent-filter> </receiver> 

O programáticamente:

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

Y como se describe en las otras soluciones, puede consultar el modo de avión cuando su receptor fue notificado y lanzar su excepción.

Al registrar el modo de avión BroadcastReceiver (respuesta de @saxos) pienso que hace mucho sentido conseguir el estado del modo del aeroplano que fija enseguida de los Intent Extras la Intent Extras para evitar llamar Settings.Global o 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 } } 

Desde aquí :

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

Con el fin de deshacerse de la queja de la depreciación (al orientar API17 + y no preocuparse demasiado acerca de la compatibilidad hacia atrás), uno tiene que comparar con 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); } 

Cuando se considera una API más baja:

 /** * @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; } } 

Receptor de radiodifusión estática

Código manifiesto:

 <receiver android:name=".airplanemodecheck" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.AIRPLANE_MODE"></action> </intent-filter> </receiver> 

Código Java: Broadcast Receiver java file

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

O

Receptor de difusión dinámico

Código Java: Actividad archivo java

Registro de receptor de radiodifusión en la aplicación abierta no hay necesidad de añadir código en el manifiesto si usted toma una acción sólo cuando su actividad abierta como modo de verificación de avión está encendido o apagado cuando se accede a 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); } 

Código Java: Broadcast Receiver java file

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

Desde el nivel 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; } 

Escribí esta clase que podría ser útil. No devuelve directamente un booleano para indicarle si el modo Avión está activado o desactivado, pero le notificará cuando se cambie el modo avión de uno a otro.

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

Uso

 // 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(); } 

Usted podría comprobar si el Internet está encendido

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

}

  • Mejor implementación de Rotate3dAnimation en Android ViewFlipper
  • Cómo hacer un reemplazo sobre las webs cargadas en una Webview
  • Las clases siguientes no pudieron ser instanciadas: - android.support.v7.widget.Toolbar
  • Alternativa para String.join en Android?
  • Cambiar el tamaño de una ruta en el lienzo de Android
  • Para comprobar si la cadena contiene una palabra en particular
  • Manejar un evento: implementar una interfaz o usar una clase interna para manejar la interfaz. Cual es mejor
  • Android dos AsyncTasks ejecución en serie o en paralelo? - El segundo es helada pero el resultado es bueno
  • Cambiar la ubicación del indicador en ExpandableListView causando problemas
  • Java.lang.IllegalArgumentException: Necesita utilizar un tema Theme.AppCompat (o descendente) con la biblioteca de diseño
  • ¿Cómo puedo detener un temporizador?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.