web-dev-qa-db-fra.com

Comment détecter le mode avion sur Android?

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

85
Sean W.
/**
* 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.Global.AIRPLANE_MODE_ON, 0) != 0;

}
123
Alex Volovoy

En élargissant la réponse d'Alex pour inclure la vérification de 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;
    }       
}
90
Tiago

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 (pré-Android 8.0):

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

ou par programme (toutes les versions d'Android):

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 est prévenu et lancer votre exception. 

47
saxos

Lors de l'enregistrement du mode Avion BroadcastReceiver (@saxos answer), je pense qu'il est très judicieux d'obtenir l'état du paramètre Mode avion immédiatement du Intent Extras 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
    }
}
18
eldjon

De ici :

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

pour se débarrasser de la réclamation liée à la dépréciation (lorsque l’on cible API17 + et qu’on ne se préoccupe pas trop de la compatibilité ascendante), 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);
}

lorsque vous envisagez une 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;
    }
}
4
Martin Zeitler

En Oreo, veuillez ne pas utiliser le mode avion broadCastReceiver. c'est une intention implicite. il a été enlevé. Voici la liste actuelle des exceptions . il 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;
        }
    }
2
j2emanue

Récepteur de diffusion statique

Code manifeste:

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

Code Java: fichier 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();
}

OR

Récepteur de diffusion dynamique

Code Java: fichier Java d'activité

Enregistrez le récepteur de radiodiffusion sur une application ouverte sans avoir besoin d'ajouter de code dans le manifeste si vous effectuez une action uniquement lorsque votre activité est ouverte, comme le mode Vérifier 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 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();
}

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

    }
1
Vineesh TP

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 récents changements d’autorisation, ConnectivityManager.CONNECTIVITY_ACTION et Intent.ACTION_AIRPLANE_MODE_CHANGED sont maintenant nécessaires.

0
Gus

J'ai écrit ce cours qui pourrait être utile. Il ne renvoie pas directement un booléen pour vous dire si le mode avion est activé ou désactivé, mais il vous avertira lorsque le mode avion est 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);

}

Utilisation

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