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

Tengo un código en mi aplicación que detecta si el Wi-Fi está conectado activamente. Ese código desencadena una RuntimeException si el modo avión está habilitado. Me gustaría mostrar un mensaje de error por separado cuando esté en este modo de todos modos. ¿Cómo puedo detectar de manera confiable 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; } 

Al extender 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 sondear si el modo de avión está activo o no, puede registrar un BroadcastReceiver para la intención SERVICE_STATE y reactjsr en él.

Ya sea en su ApplicationManifest:

      

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 sondear el modo avión cuando su receptor fue notificado y emitir su excepción.

Al registrar el modo de avión BroadcastReceiver (@saxos answer), creo que tiene mucho sentido obtener el estado del modo de modo de avión inmediatamente fuera de los Intent Extras para evitar llamar a 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; } 

Para deshacerse de la queja de depreciación (cuando se dirige a API17 + y no se preocupa demasiado por la compatibilidad con versiones anteriores), 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 transmisión estático

Código de manifiesto:

      

Código Java: archivo Java Broadcast Receiver

 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 radiodifusión dinámica

Código Java: archivo de actividad java

Registre el receptor de difusión en la aplicación abierta. No necesita agregar código en el manifiesto si realiza una acción solo cuando su actividad se abre, como el modo de verificación del avión, está activado o desactivado cuando 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: archivo Java Broadcast Receiver

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

En Oreo, no use el modo de avión broadCastReceiver. es un bash implícito. ha sido eliminado. Aquí está la lista de excepciones actual. no está actualmente en la lista, por lo que no debe recibir datos. Considéralo muerto.

según lo indicado por otro usuario anterior utilice el siguiente código:

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

Escribí esta clase que podría ser útil. No devuelve directamente un booleano para indicarle si el modo avión está habilitado o deshabilitado, pero le avisará cuando el modo avión cambie 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(); } 

Aquí está lo único que funcionó para mí (API 27):

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

Donde br es su BroadcastReceiver. Creo que con los cambios recientes en el permiso ahora se necesitan tanto ConnectivityManager.CONNECTIVITY_ACTION como Intent.ACTION_AIRPLANE_MODE_CHANGED .

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

}