Mode avion à bascule dans Android

ai-je fait une erreur? Il 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);
}
22
demandé sur Peter Mortensen 2011-04-04 06:00:56

10 réponses

Cette réponse contient le code nécessaire pour ce faire. Assurez-vous également d'avoir la permission WRITE_SETTINGS .

adapté de Mode Avion de commande :

// 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);
40
répondu Matthew Willis 2017-05-23 12:17:39

ce qui suit peut être utilisé sur un dispositif enraciné .

depuis commandline, vous pouvez activer/désactiver le mode avion avec ce qui suit:

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+

11
répondu siesta 2015-03-10 14:57:19

je pense" paramètres.Système.AIRPLANE_MODE_ON" est déprécié, Im en utilisant:

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 aidera quelqu'un.

8
répondu cesaregb 2013-08-03 19:11:53

fonctionne pour toutes les versions API.

  • switch authomaticaly for API < 17
  • ouvert par Défaut de l'Activité de l'Avion mode d'action de l'utilisateur pour API >= 17

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


dans AndroidManifest.XML ajouter autorisation:

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

puis:

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

            }
        });
    }
7
répondu Yuliia Ashomok 2016-06-11 10:42:45

après lollipop, vous pouvez utiliser la méthode ci-dessous, mais c'est l'api cachée et votre application a besoin d'une permission 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
répondu yasinkafadar 2015-03-03 07:48:56

comme @eggyal l'a mentionné le mode avion basculant ne peut pas être fait à partir de la version 4.2 et plus.

mais ce que nous pouvons faire, c'est tourner chacun des services sans fil:

Wifi peut être contrôlé en utilisant WifiService ~ getSystemService(Context.WIFI_SERVICE). Bluetooth peut être contrôlé en utilisant BluetoothAdapter - getSystemService(Context.BLUETOOTH_SERVICE).

après quelques recherches, J'ai découvert Qu'en utilisant Java Reflection vous pouvez encore contrôler les Radios Android (Wifi, réseau, Bluetooth) ce que le Mode Avion fait essentiellement est basculer l'état de Bluetooth, Wifi et les réseaux.

ainsi, en contrôlant les Radios, vous pouvez en fait créer votre propre Mode Avion.

avertissement: L'utilisation de la réflexion peut échouer sur certains dispositifs (dépend de la mise en œuvre des classes par le fabricant).

ce 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
répondu Raanan 2015-06-02 09:24:08

ici avant chaque Paramètres utilisez android.fournisseur 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
répondu ROR 2014-03-18 23:33:22

Notez que, comme indiqué sous Android 4.2 Api (nous soulignons):

Nouveaux Paramètres Globaux

les paramètres du 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 parce qu'ils sont en lecture seule, mais s'applique globalement à tous les espaces de l'utilisateur sur l'appareil.

plusieurs contextes existants ont été déplacés ici de Settings.System ou Settings.Secure . Si votre application est en train de modifier les paramètres définis dans Settings.System (par exemple: AIRPLANE_MODE_ON ), puis vous devriez vous attendre à ce que cela ne fonctionnera plus sur un appareil fonctionnant sous Android 4.2 ou plus si ceux les paramètres ont été déplacés vers Settings.Global . Vous pouvez continuer à lire les paramètres Settings.Global , mais parce que les paramètres ne sont plus considérés comme sûrs pour les applications de changer, tenter de le faire échouera silencieusement et le système écrira un avertissement au Journal du système lors de l'exécution de votre application sur Android 4.2 ou plus.

3
répondu eggyal 2014-05-12 20:57:34

celui-ci travaille 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 de permissions système bien que

<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
1
répondu Deepu 2017-04-20 18:52:41

j'ai trouvé cette solution de contournement pour 17+ si vous voulez arrêter l'internet.

autorisation

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

méthode

@SuppressWarnings({ "unchecked", "rawtypes" })
private void setMobileDataEnabled(boolean state) {
    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 setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
        setMobileDataEnabledMethod.setAccessible(true);
        setMobileDataEnabledMethod.invoke(iConnectivityManager, state);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
-1
répondu Xjasz 2015-04-27 06:21:27