Android L (5.x) Activar / desactivar "Mobile Data" mediante programación

Necesito activar / desactivar los datos móviles mediante programación. Debajo del código no funciona para 5.x. Podrías ayudarme. Gracias por adelantado.

private void setMobileDataEnabled(Context context, boolean enabled) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); final Class conmanClass = Class.forName(conman.getClass().getName()); final Field connectivityManagerField = conmanClass.getDeclaredField("mService"); connectivityManagerField.setAccessible(true); final Object connectivityManager = connectivityManagerField.get(conman); final Class connectivityManagerClass = Class.forName(connectivityManager.getClass().getName()); final Method setMobileDataEnabledMethod = connectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE); setMobileDataEnabledMethod.setAccessible(true); setMobileDataEnabledMethod.invoke(connectivityManager, enabled); } 

03-30 12: 42: 29.466: W / System.err (5966): java.lang.NoSuchMethodException: setMobileDataEnabled [boolean] 03-30 12: 42: 29.466: W / System.err (5966): en java.lang .Class.getMethod (Class.java:664) 03-30 12: 42: 29.466: W / System.err (5966): en java.lang.Class.getDeclaredMethod (Class.java:626)

Java.lang.NoSuchMethodException: setMobileDataEnabled [boolean] @ debajo de la línea.

Método final setMobileDataEnabledMethod = conectividadManagerClass.getDeclaredMethod ("setMobileDataEnabled", Boolean.TYPE);

Parece que el método setMobileDataEnabled ya no existe en ConnectivityManager y esta funcionalidad se movió a TelephonyManager con dos métodos getDataEnabled y setDataEnabled.

 public void setMobileDataState(boolean mobileDataEnabled) { try { TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Method setMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("setDataEnabled", boolean.class); if (null != setMobileDataEnabledMethod) { setMobileDataEnabledMethod.invoke(telephonyService, mobileDataEnabled); } } catch (Exception ex) { Log.e(TAG, "Error setting mobile data state", ex); } } public boolean getMobileDataState() { try { TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); Method getMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("getDataEnabled"); if (null != getMobileDataEnabledMethod) { boolean mobileDataEnabled = (Boolean) getMobileDataEnabledMethod.invoke(telephonyService); return mobileDataEnabled; } } catch (Exception ex) { Log.e(TAG, "Error getting mobile data state", ex); } return false; } 

Al ejecutar el código obtendrá una excepción de seguridad que indica que ni el usuario 10089 ni el proceso actual tiene android.permission.MODIFY_PHONE_STATE.

Un permiso MODIFY_PHONE_STATE se debe agregar Tengo esto de Respuesta Gracias Muzikant

En Android L 5.xx se elimina el método setMobileDataEnabled de la API oculta y ya no se puede utilizar. Puede verificar esto en el código fuente de lolipop de android en /frameworks/base/core/java/android/net/ConnectivityManager.java.

Si todavía insiste en realizarlo, puede utilizar el fragmento de código contestado por Kushal, pero getDataEnabled es un api del sistema, que las aplicaciones de usuario normal no pueden acceder. También hay un sistema más api disponible setDataEnabled bajo TelephonyManager. (/frameworks/base/telephony/java/android/telephony/TelephonyManager.java)

 /** @hide */ @SystemApi public void setDataEnabled(boolean enable) { setDataEnabled(SubscriptionManager.getDefaultDataSubId(), enable); } 

También necesita el permiso "android.permission.MODIFY_PHONE_STATE" que funcionará sólo en dispositivos con raíz.

  • NullPointerException: int android.support.v4.app.FragmentManagerImpl.mCurState Referencia de objeto null
  • Abrir directorio específico mediante Storage Access Framework
  • Progreso circular con un botón de acción flotante
  • La configuración regional no está definida de forma programática en Android 5.0 Lollipop
  • La vista de lista establece un selector de rizado personalizado
  • Las ondulaciones no se muestran con selectableItemBackground como primer plano en un CardView con un dispositivo Android 5.0
  • Notificación de Lollipop setVisibility () ¿No funciona?
  • ¿Cómo evito que la barra de estado y la barra de navegación se animen durante una transición de animación de escena de actividad?
  • Color androide del efecto del borde del scrollview del lollipop
  • Cómo tener un botón de interruptor Lollipop
  • INSTALL_FAILED_DUPLICATE_PERMISSION ... C2D_MESSAGE
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.