我怎样才能在Android上以编程方式closures3G /数据?

如何在Android上以编程方式closures3G / Data?

不是Wifi,而是3G /数据。

没有官方的方法来做到这一点。 但是,可以通过反思来非正式地实现。

对于Android 2.3及以上版本:

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

这也需要以下权限。

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

对于Android 2.2及以下版本:

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

这需要以下权限:

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

请注意,这些都是非官方的,可能不再有效。 没有更多的证据表明应该打破这种事情,因为2.2和以下的方法打破了2.3。

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

在清单中,添加以下权限:

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

我仍然在2.1,所以这个解决scheme适合我。

但是你还需要包含MODIFY_PHONE_STATE permision。

完整的代码(带有button)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>