Alternar el modo avión en Android

¿ Me equivoco? No es de trabajo.

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);
}
InformationsquelleAutor user669046 | 2011-04-04

10 Kommentare

  1. 41

    Esta respuesta contiene el código necesario para ello. También asegúrese de que usted tiene el WRITE_SETTINGS permiso.

    Adaptado de El Control De Modo De Avión:

    //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);
    • Esto ya no es posible a partir de Android 4.2 y superiores.
    • Esto no funciona en Android 4.2+
    • sí, no va a funcionar en 4.2.x= porque se requiere un WRITE_SECURE_SETTINGS permiso que sólo está disponible para aplicaciones del sistema. Gracias a Google lentamente alienar a nosotros poco a los chicos.
    • Por favor, tenga en cuenta que alternar el modo de avión activado/desactivado ya no es posible a partir de Android 4.2 (Jelly Bean gran versión 1). Esto es debido a que Google ha adoptado un VENDAJE / solución CONVENIENTE (para ellos mismos) para abordar las deficiencias en Android en lugar de re-examinar su modelo de seguridad. Hay maneras de conseguir alrededor de este problema – por ejemplo, como tener un dispositivo de raíces y/o instalar una aplicación como un sistema de aplicación – para permitir el modo avión para el trabajo. Por desgracia, esto no va a ser algo que un «usuario» se sabe cómo hacerlo o QUIERES hacer…
    • Los Ajustes.Sistema.AIRPLANE_MODE_ON está en desuso en la API de nivel 17. Uso De La Configuración.Global.AIRPLANE_MODE_ON lugar.
    • Cómo funciona en el dispositivo de raíces? el uso de «bad subvención» en el «write_secure_settings» permiso?
    • No. Pero si usted está interesado, pregunte a su pregunta sobre el modo Avión en el galaxy y me va a responder que no. Yo no LO creo moderadores permitirá una pregunta dentro de una pregunta. 😉
    • Por supuesto que está bien… además de que es todavía relativa a la pregunta original. por supuesto, si es demasiado largo, puedo ponerlo en una nueva pregunta…
    • Sí, por favor, publicarlo como una cuestión separada y me apunte al enlace y voy a ser feliz de la respuesta es no. Gracias.
    • OK, lo he puesto aquí: stackoverflow.com/questions/25674655
    • En Android 5.0 cuando estoy tratando de enviar broadcast (ACTION_AIRPLANE_MODE_CHANGED), me puse una excepción de seguridad. Yo pongo todos requieren permisos y mi aplicación es una aplicación del sistema.
    • Por favor, ¿puedo saber la funcionalidad está trabajando después de poner debajo de permiso ? <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SETTINGS"/>

  2. 13

    La siguiente información puede ser usada en un arraigada dispositivo.

    De línea de comandos, puede activar el modo de avión activado/desactivado con el siguiente:

    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

    Esto funciona con android 4.4.2+

    • Trabajando en 4.2.2 aquí. Muy útil!
    • Trabajando en 4.3
    • No funciona desde Android 5.
    • Trabajando en android 5. @Michal, se que ejecutar esto como root? Necesita ser ejecutado como root de android 4.2 en adelante.
  3. 11

    Funciona para todas las versiones de API.

    • interruptor authomaticaly para API < 17
    • abierto por Defecto de la Actividad de Avión
      el modo por las acciones del usuario para API >= 17

    no raíz, no a nivel de sistema de permisos!


    en AndroidManifest.xml permiso agregar:

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

    a continuación:

    @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();
                            }
                        }
                    }
    
                }
            });
        }
    • +1 yo creo que esa es la forma en la que google quiere que nosotros hagamos esto: enviar al usuario para la correcta configuración de la página y dejan de hacer el ajuste – si no son demasiado ignorantes para hacer esto 😉 Un promt (como un cuadro de diálogo con un texto explicando qué hacer y con un «OK» y «No ahora» botón) sería recomendable aunque
  4. 8

    Creo que «los Ajustes.Sistema.AIRPLANE_MODE_ON» está en desuso, estoy usando:

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

    Espero que esto ayude a alguien.

    • El setSettings función no funciona en Jelly Bean: Settings.Global es de sólo lectura.
    • Ok gracias, voy a cambiar el código para solucionar este
    • Esto requiere android.el permiso.WRITE_SECURE_SETTINGS, la cual no está disponible para aplicaciones 3 ª parte. Ver este link
    • Está usted seguro de que esta solución funciona?
  5. 4

    Después de lollipop, puede utilizar el siguiente método, pero se oculta la api y las necesidades de su aplicación a nivel del sistema de permiso

    <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL"/>
    
    ConnectivityManager mgr =  (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
            mgr.setAirplaneMode(true); 
    • disponible en kitkat +
    • No hay tal método existen mostrando su error en Android studio «mons.setAirplaneMode(true);»
    • Este método se puede utilizar sólo por el sistema de aplicación,si la aplicación está instalada, obliviously,tiene que lograr por medio de la reflexión ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); try { if(mgr != null) { Method airPlane = ConnMgr.getClass().getDeclaredMethod("setAirplaneMode", boolean.class); if(null != aiPlane) { airPlane.invoke(mgr, !isEnabled); } } } catch
  6. 4

    Como @eggyal mencionado activando el Modo Avión no se puede hacer a partir de la versión 4.2 y hasta.

    Pero lo que podemos hacer es convertir cada uno de los servicios inalámbricos:

    El Wifi puede ser controlado mediante el uso de WifiService ~ getSystemService(Context.WIFI_SERVICE).
    Bluetooth puede ser controlado mediante el uso de BluetoothAdapter – getSystemService(Context.BLUETOOTH_SERVICE).

    Después de investigar un poco he encontrado que el uso de Java Reflexión todavía se puede controlar el Android Radios (Wifi, Red, Bluetooth) ¿de qué Modo Avión básicamente hace es alternar el estado de Bluetooth, wi-fi y Redes.

    Por el control de las Radios usted puede, en efecto, crear su propio Modo de Avión.

    ADVERTENCIA: el Uso de la Reflexión puede fallar en algunos dispositivos (depende del fabricante de la implementación de las clases).

    Este código de ejemplo alterna de la Red Móvil:

    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;
        }
    }
    • Falta de definición de estafador ?
    • No trabajo para Naugat. Lanzando una excepción NoSuchMethodException setRadio
  7. 3

    aquí antes de que todos los ajustes de android.proveedor de como esta :

    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);
    
        }
    
    }
  8. 3

    Tenga en cuenta que, tal como se documenta en Android 4.2 Api (énfasis añadido):

    Nueva Configuración Global

    La configuración del sistema se han actualizado para soportar múltiples usuarios, con la adición de Ajustes.Global. Esta colección de la configuración es similar a la Ajustes.Seguro, pues son sólo de lectura, sino que se aplica de forma global a través de todos los espacios de usuario en el dispositivo.

    Varios de los ajustes se trasladó aquí desde Ajustes.Sistema o Ajustes.Seguro. Si su aplicación es en la actualidad de hacer cambios a la configuración definida anteriormente en Ajustes.Sistema (como AIRPLANE_MODE_ON), entonces usted debe esperar que, al hacerlo, dejará de funcionar en un dispositivo con Android 4.2 o superior si esos valores fueron trasladados a Ajustes.Global. Usted puede continuar la lectura de los ajustes que están en Ajustes.Global, pero debido a que la configuración ya no se considera seguro para aplicaciones a cambiar, intentar hacerlo se producirá en silencio y el sistema de escritura de una advertencia en el registro del sistema cuando se ejecuta la aplicación en Android 4.2 o superior.

  9. 1

    Este uno trabaja para mí

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

    Pero necesita permisos del sistema, aunque

    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
    • ¿Cómo hacer que funcione? ¿cómo hacer que la aplicación de un sistema de aplicación?
    • he trabajado para un OEM y que era una aplicación precargada en el sistema de la imagen.
  10. -1

    He encontrado esta solución para 17+ si desea apagar el internet esto va a funcionar.

    permiso

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

    método

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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea