web-dev-qa-db-fra.com

Basculer le mode avion dans Android

Ai-je fait une erreur? Ça ne fonctionne pas.

public void airplane() {
    boolean isEnabled = Settings.System.getInt(this.getApplicationContext().getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1;
    Settings.System.putInt(context.getContentResolver(),Settings.System.AIRPLANE_MODE_ON,isEnabled ? 0 : 1);
    //Settings.System.putInt(this.getApplicationContext().getContentResolver(),Settings.System.AIRPLANE_MODE_ON,isEnabled ? 0 : 1);
    Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
}
23
user669046

Cette réponse contient le code nécessaire pour ce faire. Assurez-vous également que vous disposez du WRITE_SETTINGS autorisation.

Adapté de Contrôle du mode avion :

// read the airplane mode setting
boolean isEnabled = Settings.System.getInt(
      getContentResolver(), 
      Settings.System.AIRPLANE_MODE_ON, 0) == 1;

// toggle airplane mode
Settings.System.putInt(
      getContentResolver(),
      Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);

// Post an intent to reload
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", !isEnabled);
sendBroadcast(intent);
41
Matthew Willis

Les éléments suivants peuvent être utilisés sur un appareil rooté.

Depuis la ligne de commande, vous pouvez activer/désactiver le mode avion avec les éléments suivants:

ON:
settings put global airplane_mode_on 1
am broadcast -a Android.intent.action.AIRPLANE_MODE --ez state true

OFF:
settings put global airplane_mode_on 0
am broadcast -a Android.intent.action.AIRPLANE_MODE --ez state false

Cela fonctionne avec Android 4.4.2+

13
siesta

Fonctionne pour toutes les versions d'API.

  • basculer automatiquement pour API <17
  • ouvrir l'activité par défaut du mode avion pour les actions de l'utilisateur pour API> = 17

pas de racine, pas d'autorisation au niveau du système !


dans AndroidManifest.xml ajouter la permission:

<!--airplane mode-->
<uses-permission Android:name="Android.permission.WRITE_SETTINGS"/>

ensuite:

@SuppressWarnings("deprecation")
    private void initAirplanemodeBtn() {
        airplanemodeButton = (ToggleButton) findViewById(R.id.airplanemode_btn);
        airplanemodeButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if (Android.os.Build.VERSION.SDK_INT < 17) {
                    try {
                        // read the airplane mode setting
                        boolean isEnabled = Settings.System.getInt(
                                getContentResolver(),
                                Settings.System.AIRPLANE_MODE_ON, 0) == 1;

                        // toggle airplane mode
                        Settings.System.putInt(
                                getContentResolver(),
                                Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);

                        // Post an intent to reload
                        Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
                        intent.putExtra("state", !isEnabled);
                        sendBroadcast(intent);
                    } catch (ActivityNotFoundException e) {
                        Log.e(TAG, e.getMessage());
                    }
                } else {
                    try {
                        Intent intent = new Intent(Android.provider.Settings.ACTION_AIRPLANE_MODE_SETTINGS);
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);
                    } catch (ActivityNotFoundException e) {
                        try {
                            Intent intent = new Intent("Android.settings.WIRELESS_SETTINGS");
                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            startActivity(intent);
                        } catch (ActivityNotFoundException ex) {
                            Toast.makeText(buttonView.getContext(), R.string.not_able_set_airplane, Toast.LENGTH_SHORT).show();
                        }
                    }
                }

            }
        });
    }
11
Yuliia Ashomok

Je pense que "Settings.System.AIRPLANE_MODE_ON" est obsolète, je utilise:

public class AirplaneModeService {
    public boolean run(Context context) {
        boolean isEnabled = isAirplaneModeOn(context);
        // Toggle airplane mode.
        setSettings(context, isEnabled?1:0);
        // Post an intent to reload.
        Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        intent.putExtra("state", !isEnabled);
        context.sendBroadcast(intent);
        return true;
    }
    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;
        }       
    }
    public static void setSettings(Context context, int value) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
            Settings.System.putInt(
                      context.getContentResolver(),
                      Settings.System.AIRPLANE_MODE_ON, value);
        } else {
            Settings.Global.putInt(
                      context.getContentResolver(),
                      Settings.Global.AIRPLANE_MODE_ON, value);
        }       
    }
}

J'espère que cela aide quelqu'un.

8
cesaregb

Comme @eggyal l'a mentionné, le basculement du mode avion ne peut pas être effectué à partir de la version 4.2 et plus.

Mais ce que nous pouvons faire, c'est transformer chacun des services sans fil:

Le Wifi peut être contrôlé à l'aide de WifiService ~ getSystemService (Context.WIFI_SERVICE). Bluetooth peut être contrôlé à l'aide de BluetoothAdapterSetemService (Context.BLUETOOTH_SERVICE).

Après quelques recherches, j'ai trouvé qu'en utilisant Java Reflection, vous pouvez toujours contrôler les Android Radios (Wifi, réseau, Bluetooth) ce que le mode avion fait essentiellement est de basculer l'état) Bluetooth, Wifi et Réseaux.

Ainsi, en contrôlant les radios, vous pouvez en effet créer votre propre mode avion.

AVERTISSEMENT: l'utilisation de Reflection peut échouer sur certains périphériques (dépend de l'implémentation des classes par le fabricant).

Cet exemple de code bascule le réseau mobile:

private void setMobileRadioEnabled(boolean enabled) {
    try {
        final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        final Class conmanClass = Class.forName(conman.getClass().getName());
        final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
        iConnectivityManagerField.setAccessible(true);
        final Object iConnectivityManager = iConnectivityManagerField.get(conman);
        final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
        final Method setRadio = iConnectivityManagerClass.getDeclaredMethod("setRadio", Integer.TYPE ,  Boolean.TYPE);
        setRadio.setAccessible(true);
        for (NetworkInfo networkInfo : conman.getAllNetworkInfo()) {
            if(isNetworkTypeMobile(networkInfo.getType())) {
                setRadio.invoke(iConnectivityManager, networkInfo.getType(), enabled);
            }
        }
    } catch (Exception e) {
        Log.e(TAG, "Opss...", e);
    }
}

public static boolean isNetworkTypeMobile(int networkType) {
    switch (networkType) {
        case ConnectivityManager.TYPE_MOBILE:
        case ConnectivityManager.TYPE_MOBILE_MMS:
        case ConnectivityManager.TYPE_MOBILE_SUPL:
        case ConnectivityManager.TYPE_MOBILE_DUN:
        case ConnectivityManager.TYPE_MOBILE_HIPRI:
        case 10:
        case 11:
        case 12:
        case 14:
            return true;
        default:
            return false;
    }
}
4
Raanan

Après Lollipop, vous pouvez utiliser la méthode ci-dessous, mais c'est une API cachée et votre application nécessite une autorisation au niveau du système

<uses-permission Android:name="Android.permission.CONNECTIVITY_INTERNAL"/>

ConnectivityManager mgr =  (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
        mgr.setAirplaneMode(true); 
4
yasinkafadar

ici avant que tous les paramètres utilisent Android.provider comme ceci:

public class MainActivity extends Activity implements OnClickListener {

    Button air;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        air = (Button) findViewById(R.id.button1);
        air.setOnClickListener(this);
    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        // read the airplane mode setting
        boolean isEnabled = Android.provider.Settings.System.getInt(
              getContentResolver(), 
              Android.provider.Settings.System.AIRPLANE_MODE_ON, 0) == 1;

        // toggle airplane mode
        Android.provider.Settings.System.putInt(
              getContentResolver(),
              Android.provider.Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);

        // Post an intent to reload
        Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        intent.putExtra("state", !isEnabled);
        sendBroadcast(intent);

    }

}
3
ROR

Notez que, comme indiqué sous API Android 4.2 (emphase ajoutée):

Nouveaux paramètres globaux

Les paramètres système ont été mis à jour pour prendre en charge plusieurs utilisateurs avec l'ajout de Settings.Global . Cette collection de paramètres est similaire à Settings.Secure paramètres car ils sont en lecture seule, mais s'appliquent globalement à tous les espaces utilisateur de l'appareil.

Plusieurs paramètres existants ont été déplacés ici depuis Settings.System ou Settings.Secure . Si votre application modifie actuellement les paramètres précédemment définis dans Settings.System (comme AIRPLANE_MODE_ON ), alors vous devez vous attendre à ce que cela ne fonctionne plus sur un appareil exécutant Android 4.2 ou supérieur si ces paramètres ont été déplacés vers Settings.Global . Vous pouvez continuer à lire les paramètres qui sont dans Settings.Global , mais car les paramètres ne sont plus considérés comme sûrs pour les applications à modifier, toute tentative échouera silencieusement et le système écrira un avertissement au journal système lors de l'exécution de votre application sur Android 4.2 ou supérieur.

3
eggyal

Celui-ci fonctionne pour moi

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

public static void setAirPlaneMode(boolean airplaneMode) {
    Logger.d(LOG_TAG + "setAirPlaneMode airplaneMode: " + airplaneMode) ;
    int state = airplaneMode ? 1 : 0;
    Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON,
                             state);
    Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
    intent.putExtra("state", state);
    mContext.sendBroadcast(intent);
}

Mais vous avez besoin des autorisations système

<uses-permission Android:name="Android.permission.WRITE_SECURE_SETTINGS" />
1
Deepu