¿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?
- Constant 'Running Android Lint' Falló, nullpointerexception apareciendo en Eclipse (pero no parece ser mi código)
- ¿Cómo implemento correctamente Immersive Full-Screen Mode en Android?
- Diferentes respuestas entre el sitio de Google y la API de Google
- Cómo jugar notas individuales de archivo midi en LibGDX?
- Android - Transiciones de elementos compartidos con actividad de llamada finish ()
- Android: ¿Cómo capturar los extras de Intent si la actividad ya se está ejecutando?
- Cómo hacer espacio entre spannable cadena en Android?
- ¿El mejor método para medir el tiempo de ejecución en Android?
- Java.net.UnknownHostException: No se puede resolver el host "<url>": ninguna dirección asociada con hostname y End of input en el carácter 0 de
- Implementación de Instagram como sistema de navegación en aplicaciones en Android
- ¿Cómo activar el botón "Compartir" en la aplicación Android?
- UnsatisfiedLinkError: No se pudo cargar X desde el cargador
- Acción Snackbar getView ()
/** * 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; }
}
- Barra de estado transparente de Android y barra de acción
- No se encuentra el ancla de confianza para la conexión SSL de Android