2012-11-23 9 views

risposta

18

utilizzare il seguente metodo. Funzionerà con tutte le versioni di Android.

int bv = Build.VERSION.SDK_INT; 

boolean turnOnDataConnection(boolean ON,Context context) 
{ 

    try{ 
     if(bv == Build.VERSION_CODES.FROYO) 

     { 
      Method dataConnSwitchmethod; 
      Class<?> telephonyManagerClass; 
      Object ITelephonyStub; 
      Class<?> ITelephonyClass; 

      TelephonyManager telephonyManager = (TelephonyManager) context 
        .getSystemService(Context.TELEPHONY_SERVICE); 

      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 (ON) { 
       dataConnSwitchmethod = ITelephonyClass 
         .getDeclaredMethod("enableDataConnectivity"); 
      } else { 
       dataConnSwitchmethod = ITelephonyClass 
         .getDeclaredMethod("disableDataConnectivity"); 
      } 
      dataConnSwitchmethod.setAccessible(true); 
      dataConnSwitchmethod.invoke(ITelephonyStub); 

      } 
     else 
      { 
      //log.i("App running on Ginger bread+"); 
      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, ON); 
      } 


     return true; 
    }catch(Exception e){ 
         Log.e(TAG,"error turning on/off data"); 

         return false; 
         } 

} 

Autorizzazioni necessarie:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"/> 
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 

UPDATE:

A partire da Android L questo funziona solo per le applicazioni di sistema

+0

E bv è variabile/oggetto di classe ...... ?????? –

+0

Siamo spiacenti, .. Si prega di consultare la risposta aggiornata. – JiTHiN

+1

E sto ricevendo errore in 3 righe sotto 1) finale iConnectivityManagerField = conmanClass.getDeclaredField ("mService"); Errore: impossibile convertire da field a Dataformat.field..e Sugsession è change typ di iconnectvitymrgfield al campo –

6

Questo codice in esecuzione in Android Gingerbread e versioni successive:

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

NOTA: U necessario aggiungere questa riga sotto IN ANDROIDMAINFEST.XML

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

Grazie mille anche per il tuo contributo :) –

2

È inoltre necessario che il permesso:

<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/> 
2
private static boolean enableMobileData(Context context, boolean enable) { 
    boolean bool = true; 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    try { 
     Class[] arrayOfClass = new Class[1]; 
     arrayOfClass[0] = Boolean.TYPE; 
     Method enableDataMethod = ConnectivityManager.class.getMethod("setMobileDataEnabled", arrayOfClass); 
     DailySchedulerLog.v("Method enableDataMethod = %s", enableDataMethod.getName()); 
     Object[] arrayOfObject = new Object[1]; 
     arrayOfObject[0] = Boolean.valueOf(enable); 
     enableDataMethod.invoke(cm, arrayOfObject); 
     return bool; 
    } catch (Exception localException) { 
     //   while (true) { 
     DailySchedulerLog.d("Exception !!!!!!!!! loops"); 
     return bool = false; 
     //   } 
    } 
} 

questo snipcode funziona con il mio caso. Plz, aggiungi permessi per cambiare rete

+0

Ha funzionato come un fascino piacevole. –

Problemi correlati