您的位置:首页 > 理论基础 > 计算机网络

android 控制设备网络接入点

2013-04-18 19:22 344 查看
项目需要使用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权限需要在源码环境下编译或者使用系统签名才可通过。

需要添加权限:

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

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

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

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

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

<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: