项目需要使用cmwap来接入网络 :
1. 判断当前设备是否有网络接入(有那么检测是什么接入方式【wifi? cmnet? cmwap?】)
2. 如果没有任何接入那么 强制使用GPRS数据接入
2.1 如果强制数据接入后为cmnet接入那么还需要强制转换为cmwap接入
2.2 如果强制数据接入后为cmwap那么不做任何操作
3. 如果当前设备为wifi接入那么关闭wifi强制GPRS数据接入【有cmnet和cmwap 两种】
3.1 如果强制数据接入后为cmnet接入那么还需要强制转换为cmwap接入
3.2 如果强制数据接入后为cmwap那么不做任何操作
4. 如果当前为GPRS数据接入那么判断是cmnet还是cmwap
4.1 如果为cmnet接入那么强制转换为cmwap接入
4.2 如果强制数据接入后为cmwap那么不做任何操作
代码实现如下:
package com.c; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class C extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /** * @author zc* * @data 2013-04-18* * @param context* * 判断当前设备接入网络类型 -1:无网络接入;1:wifi接入;2:cmwap接入;3:cmnet接入 * */ NetworkUtils networkUtils = new NetworkUtils(this); int apntype = networkUtils.getAPNType(this); switch (apntype) { case -1: //强制数据连接后有cmnet和cmwap networkUtils.setGprsEnabled("setMobileDataEnabled", true); Toast.makeText(this, "当前设备未连接网络开始强制数据连接", Toast.LENGTH_LONG).show(); apntype = networkUtils.getAPNType(this); if(apntype==3) { //如果强制接入的为cmnet那么执行强转为cmwap networkUtils.deletecmnet(); } break; case 1: networkUtils.setWifi(false); networkUtils.setGprsEnabled("setMobileDataEnabled", true); Toast.makeText(this, "当前wifi接入关闭wifi强制启动数据连接", Toast.LENGTH_LONG).show(); apntype = networkUtils.getAPNType(this); if(apntype==3) { //如果强制接入的为cmnet那么执行强转为cmwap networkUtils.deletecmnet(); } break; case 2: Toast.makeText(this, "当前cmwap接入无需操作", Toast.LENGTH_LONG).show(); break; case 3: Toast.makeText(this, "当前cmnet接入强制转换为cmwap", Toast.LENGTH_LONG).show(); networkUtils.deletecmnet(); break; default: break; } Button bt = (Button) findViewById(R.id.bt1); bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Uri uri = Uri.parse("http://m.10086.cn/s3/channnel/cr/600902000008654943/0026291/0001/"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); } }); } }
package com.c; import java.lang.reflect.Method; import android.content.ContentResolver; import android.content.Context; import android.database.SQLException; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.net.wifi.WifiManager; public class NetworkUtils { private static Context context; protected static Uri APN_LIST_URI; private static ConnectivityManager mCM; public NetworkUtils(Context c){ this.context=c; // APN列表资源 this.APN_LIST_URI = Uri.parse("content://telephony/carriers"); } /** 1 * @author zcmain 2 * 获取当前的网络状态 -1:没有网络 1:WIFI网络2:wap网络3:net网络 3 * @param context */ public static int getAPNType(Context context){ int WIFI = 1; int CMWAP = 2; int CMNET = 3; int netType = -1; ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); if(networkInfo==null) return netType; int apnType = networkInfo.getType(); if(apnType==ConnectivityManager.TYPE_MOBILE){ if(networkInfo.getExtraInfo().toLowerCase().equals("cmnet")){ netType = CMNET; }else{ netType = CMWAP; } }else if(apnType==ConnectivityManager.TYPE_WIFI){ netType = WIFI; } return netType; } /** * 是否开启 wifi true:开启 false:关闭 * * 一定要加入权限: <uses-permission * android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> * <uses-permission * android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> * * * @param isEnable */ public void setWifi(boolean isEnable) { WifiManager mWm = null; if (mWm == null) { mWm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); } if (isEnable) { if (!mWm.isWifiEnabled()) { mWm.setWifiEnabled(true); } } else { // 关闭 wifi if (mWm.isWifiEnabled()) { mWm.setWifiEnabled(false); } } } //检测当前GPRS数据连接是否打开 public boolean gprsIsOpenMethod(String methodName) { mCM = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); Class cmClass = mCM.getClass(); Class[] argClasses = null; Object[] argObject = null; Boolean isOpen = false; try { Method method = cmClass.getMethod(methodName, argClasses); isOpen = (Boolean) method.invoke(mCM, argObject); } catch (Exception e) { e.printStackTrace(); } return isOpen; } /** * 强制设备使用数据连接 * * @param flag * @return */ //强制设备使用数据连接 public void setGprsEnabled(String methodName, boolean isEnable) { mCM = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); Class cmClass = mCM.getClass(); Class[] argClasses = new Class[1]; argClasses[0] = boolean.class; try { Method method = cmClass.getMethod(methodName, argClasses); method.invoke(mCM, isEnable); } catch (Exception e) { e.printStackTrace(); } } public void deletecmnet(){ ContentResolver localContentResolver = context.getContentResolver(); Uri localUri = this.APN_LIST_URI; int localCursor = localContentResolver.delete(localUri, "apn LIKE 'cmnet'", null); } }
4.0及以上的听说Google限制了WRITE_APN_SETTINGS权限需要在源码环境下编译或者使用系统签名才可通过。