Cómo desactivar los datos móviles en Android
Breve historia antes de que alguien me diga que compre una aplicación. =)
Acabo de adquirir un EVO y consume la batería bastante rápido. Descargué JuiceDefender para administrar mi conexión de datos móviles. Eso parece haber funcionado bastante bien. Sin embargo, la configuración es muy restringida (incluso en las versiones pagas).
En este momento estoy intentando desarrollar una aplicación de ahorro de batería mucho más personalizable. Lo principal que intento hacer primero es poder habilitar/deshabilitar la conexión de datos móviles a voluntad.
El problema es que no puedo encontrar ningún fragmento de código ni artículo sobre cómo hacer esto. Lo único que he encontrado es lo siguiente. No sé qué tan exacto es esto, pero esto fue todo lo que pude reconstruir navegando por desarrollador.android.com
ConnectivityManager cm = (ConnectivityManager) this.getSystemService(CONNECTIVITY_SERVICE);
cm.stopUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, "android.net.conn.CONNECTIVITY_CHANGE");
State state = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
textView.setText(state.name());
Si alguien puede señalarme algo que pueda ayudar, sería muy apreciado.
ACTUALIZAR
Parece que el HTC Evo en Sprint no usa la configuración de APN. Probé esto descargando APNDroid y vi que no funciona. Luego creé una aplicación rápida para volcar todas las entradas de APN en la pantalla. Eso arrojó un resultado y fue para mms.
Al mirar la información del teléfono cuando JuiceDefender se está ejecutando, descubrí que la red GSRP se enciende y apaga. Esto me hace creer que es posible hacerlo mediante código, aunque cada página que encuentro preguntando sobre este mismo problema dice que no se puede hacer. Lo bueno es que todos dicen que lo hagamos como APNDroid. Por favor que alguien me dé una idea.
¡Gracias!
A partir de 'Gingerbread' puede utilizar el método IConnectivityManager.setMobileDataEnabled() . Está oculto en la API, pero se puede acceder a él mediante reflexión . http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/net/ConnectivityManager.java#376
Con este método puede cambiar la configuración del sistema: 'Configuración -> Inalámbrica y red -> Configuración de red móvil -> Datos habilitados '
Ejemplo de código:
private void setMobileDataEnabled(Context context, boolean enabled) {
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, enabled);
}
También necesitas el permiso CHANGE_NETWORK_STATE .
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
No hace falta decir que es posible que este enfoque no funcione en futuras versiones de Android. Pero supongo que aplicaciones como '3G watchdog', 'APNDroid' o 'DataLock' funcionan de esta manera.
ACTUALIZACIÓN :
el método setMobileDataEnabled ya no está disponible en Lollipop
Las API de habilitación y desactivación de la conexión de datos están ocultas en el SDK y no se exponen al usuario; esto se puede lograr accediendo a la interfaz de ITelephony utilizando la técnica de reflexión de Java.
aquí tienes:
Method dataConnSwitchmethod;
Class telephonyManagerClass;
Object ITelephonyStub;
Class ITelephonyClass;
TelephonyManager telephonyManager = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
if(telephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED){
isEnabled = true;
}else{
isEnabled = false;
}
telephonyManagerClass = Class.forName(telephonyManager.getClass().getName());
Method getITelephonyMethod = telephonyManagerClass.getDeclaredMethod("getITelephony");
getITelephonyMethod.setAccessible(true);
ITelephonyStub = getITelephonyMethod.invoke(telephonyManager);
ITelephonyClass = Class.forName(ITelephonyStub.getClass().getName());
if (isEnabled) {
dataConnSwitchmethod = ITelephonyClass
.getDeclaredMethod("disableDataConnectivity");
} else {
dataConnSwitchmethod = ITelephonyClass
.getDeclaredMethod("enableDataConnectivity");
}
dataConnSwitchmethod.setAccessible(true);
dataConnSwitchmethod.invoke(ITelephonyStub);