¿Cómo puedo desactivar 3G / Data de forma programática en Android?
¿Cómo puedo desactivar 3G / Data mediante programación en Android?
No Wifi, pero 3G / datos.
- ¿Pueden funcionar wifi y 3G al mismo tiempo en Android?
- Android: inhabilitar 3G y habilitar 2G
- ¿Es posible la comunicación peer-to-peer sobre 3G / 4G para teléfonos inteligentes?
- Throttle / limit android.app.DownloadManager a través del código?
- Cómo determinar si el tipo de red es 2G, 3G o 4G
- Android estadísticas 3g de tráfico para cada APP, ¿cómo?
- ¿Por qué la pila SIP nativa incluida en Android 2.3 no funciona sobre 3g?
- Forzar Android a usar 3G cuando en el área local wifi sin acceso a la red
- ¿Por qué Android no tiene una dirección MAC para 3g cuando hace iOS?
- Detección de red 3G o Wifi
- Aplicación de Android que trabaja en WIFI y 3G (Sin proxy), pero no funciona en 3G (Si proxy y puerto están asignados)
- Android: Compruebe que la red 3G o Wifi está ACTIVADA o Disponible o no en Android Dispositivo
- Cómo saber la conexión a Internet actual ejecutar en el dispositivo?
No hay forma oficial de hacer esto. Sin embargo, se puede lograr extraoficialmente con la reflexión.
Para Android 2.3 o superior:
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); }
Esto también requiere el siguiente permiso.
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
Para Android 2.2 y siguientes:
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);
Esto requería el siguiente permiso:
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
Tenga en cuenta que ambos no son oficiales y pueden dejar de funcionar. No más pruebas de este tipo de ruptura de la cosa debe ser necesaria, como el 2.2 y el método inferior se rompió en 2.3.
Envuelva el código con bloques try / catch
public void mobiledataenable(boolean enabled) { try { final ConnectivityManager conman = (ConnectivityManager)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); } catch (Exception e) { e.printStackTrace(); } }
En el Manifiesto, agregue el siguiente permiso:
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
public void onClick(View view){ ConnectivityManager dataManager; dataManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); Method dataMtd = null; try { dataMtd = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } dataMtd.setAccessible(true); try { dataMtd.invoke(dataManager, true); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
Todavía estoy en 2.1, por lo que esta solución funciona para mí.
Pero también debe incluir permision MODIFY_PHONE_STATE.
Código completo (con un botón de Google) 2.1:
package com.rivaldo.turn3gonoff; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.telephony.TelephonyManager; import android.view.Menu; import android.widget.CompoundButton; import android.widget.ToggleButton; public class Turn3GOnOff extends Activity { Method dataConnSwitchmethod_ON; Method dataConnSwitchmethod_OFF; Class telephonyManagerClass; Object ITelephonyStub; Class ITelephonyClass; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_turn3_gon_off); GetDataConnectionAPI(); ToggleButton toggle = (ToggleButton) findViewById(R.id.toggleButton); toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { turn3GOn(); } else { turn3GOff(); } } }); } private void GetDataConnectionAPI() { this.getApplicationContext(); TelephonyManager telephonyManager = (TelephonyManager) this.getApplicationContext(). getSystemService(Context.TELEPHONY_SERVICE); try { telephonyManagerClass = Class.forName(telephonyManager.getClass().getName()); Method getITelephonyMethod = telephonyManagerClass.getDeclaredMethod("getITelephony"); getITelephonyMethod.setAccessible(true); ITelephonyStub = getITelephonyMethod.invoke(telephonyManager); ITelephonyClass = Class.forName(ITelephonyStub.getClass().getName()); dataConnSwitchmethod_OFF = ITelephonyClass.getDeclaredMethod("disableDataConnectivity"); dataConnSwitchmethod_ON = ITelephonyClass.getDeclaredMethod("enableDataConnectivity"); } catch (Exception e) { // ugly but works for me e.printStackTrace(); } } private void turn3GOn() { dataConnSwitchmethod_ON.setAccessible(true); try { dataConnSwitchmethod_ON.invoke(ITelephonyStub); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } private void turn3GOff() { dataConnSwitchmethod_OFF.setAccessible(true); try { dataConnSwitchmethod_OFF.invoke(ITelephonyStub); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
Manifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.rivaldo.turn3gonoff" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.rivaldo.turn3gonoff.Turn3GOnOff" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Activity_turn3_gon_off.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" tools:context=".Turn3GOnOff" > <ToggleButton android:id="@+id/toggleButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginTop="60dp" android:textOn="3G on" android:textOff="3G off" android:text="ToggleButton" /> </RelativeLayout>
- Android: falló la conversión a formato Dalvik: no se pudo ejecutar dex: null
- Uso de la actividad de la cámara en Android