转自:http://seya.iteye.com/blog/897576

有的中国移动的业务需要走CMWAP接入点才能够连接网络的,在做这类应用的时候,不可避免地需要判断当前APN, 切换APN,以及成功连接到网络后连接到服务器。 首先,获取当前的APN有两种方式,一种是从当前系统的网络连接服务获取,即通过 ConnectivityManager conManager= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); String currentAPN = info.getExtraInfo(); CurrentAPN为‘cmnet’或者’cmwap’。。。 还有一种是通过查询数据库的方式,因为我们设置的APN是存放在本地的xml中的 首先申明APN_URI: public static final Uri CURRENT_APN_URI = Uri.parse("content://telephony/carriers/preferapn"); public static final Uri APN_LIST_URI = Uri.parse("content://telephony/carriers"); 当前选中的APN记录在CURRENT_APN_URI中,而APN_LIST_URI里面是所以的APN列表。通过以下方法获取到选中的apn名字, public static String getCurrentAPNFromSetting(ContentResolver resolver) {         Cursor cursor = null;         try {             cursor = resolver.query(CURRENT_APN_URI, null, null, null, null);             String curApnId = null;             if (cursor != null && cursor.moveToFirst()) {                 curApnId = cursor.getString(cursor.getColumnIndex("apn_id"));                 String apnName1 = cursor.getString(cursor.getColumnIndex("apn"));             }             cursor.close();             //find apn name from apn list             if (curApnId != null) {                 cursor = resolver.query(APN_LIST_URI, null, " _id = ?", new String[]{curApnId}, null);                 if (cursor != null && cursor.moveToFirst()) {                     String apnName = cursor.getString(cursor.getColumnIndex("apn"));                     return apnName;                 }             }                     } catch (SQLException e) {             Debug.error(e.getMessage());         } finally {             if (cursor != null) {                 cursor.close();             }         }                 return null; } 获取到APN之后,需要判断是否是cmwap, 如果不是需要更改当前APN为cmwap. 可以通过改数据库的方式: public static int updateCurrentAPN(ContentResolver resolver, String newAPN) {         Cursor cursor = null;         try {             //get new apn id from list             cursor = resolver.query(APN_LIST_URI, null, " apn = ? and current = 1", new String[]{newAPN.toLowerCase()}, null);             String apnId = null;             if (cursor != null && cursor.moveToFirst()) {                 apnId = cursor.getString(cursor.getColumnIndex("_id"));             }             cursor.close();                         //set new apn id as chosen one             if (apnId != null) {                 ContentValues values = new ContentValues();                 values.put("apn_id", apnId);                 resolver.update(CURRENT_APN_URI, values, null, null);             } else {                 //apn id not found, return 0.                 return 0;             }         } catch (SQLException e) {             Debug.error(e.getMessage());         } finally {             if (cursor != null) {                 cursor.close();             }         }                 //update success         return 1; } 在更改数据库之后,网络并不是立刻就能连接上的,我们需要加一个网络连接的消息监听器,发现切换成cmwap之后才开始连接服务器。NetworkChangeReceiver如下: /*      * receiver for observing network connection change      */     public class NetworkChangeReceiver extends BroadcastReceiver {         public void onReceive(Context context, Intent intent) {             if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {                 NetworkInfo info = conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);                 String apn = info.getExtraInfo();                 if ("cmwap".equals(apn)) {                     /*                      * apn change message is sent out more than once during a second, but it                      * only happens once practically.                      */                     if (mNChangeReceiver != null) {                         updateDcdContent(mManRequest);                         HwDcdCmService.this.unregisterReceiver(mNChangeReceiver);                         mNChangeReceiver = null;                     }                 }             }         }     } 切换apn总入口如下,包括了检测当前apn, 切换,注册网络监听器: /*      * change current network connection to cmwap if it's not.      */     public int forceCMWapConnection() {                 NetworkInfo info = conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);         oldAPN = info.getExtraInfo();                 //if current apn is not cmwap, we have to switch to cmwap.         if (!"cmwap".equals(oldAPN)) {             mNChangeReceiver = new NetworkChangeReceiver();             //register receiver for wap network connection.             IntentFilter upIntentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);             registerReceiver(mNChangeReceiver, upIntentFilter);              MyUtil.updateCurrentAPN(getContentResolver(), "cmwap");             return 1;         }         return 0;     } 顺便值得一提的是,使用cmwap来连接网络的时候,仅仅切换接入点还不够,需要在请求头上加上http-route.default-proxy: 10.0.172:80. 代码如下: HttpParams baseParams = new BasicHttpParams();         baseParams.setParameter("http.route.default-proxy",                 new HttpHost(“10.0.0.172”, 80));         HttpConnectionParams.setConnectionTimeout(baseParams, 30 * 1000);         HttpConnectionParams.setSoTimeout(baseParams, 45 * 1000);         // establish HttpClient         DefaultHttpClient client = new DefaultHttpClient(baseParams); 备注:笔者发现ConnectionManager提供了一个conManager.startUsingNetworkFeature(type, value),第一个设置为ConnectivityManager.TYPE_MOBILE, 第二个为”mms”的时候,也可以进行网络的切换,不涉及到setting里面的APN值的改变。第二个参数为APN接入点中的APN类型。但是这需要framework层的支持。中移动的Ophone sdk中可以使用这种方式来切换到cmwap或internet. 但是原版的android sdk中貌似不行。

android cmwap 切换 cmnet,Android CMWAP和CMNET 切换APN相关推荐

  1. CMNET和CMWAP简单区别

    1) GRPS接入方式: CMNET和CMWAP是中国移动GPRS网络的两个不同APN(Access Point Name接入点名称).CMNET提供了NAT服务,使 用该服务的手机可以直接访问int ...

  2. CMNET和CMWAP GPRS 连接

    1.CNNET,这个就不用怎么样介绍了,跟电脑上Internet没什么区别. 直接用这个这样的代码就Ok了 java 代码 try { http = (HttpConnection) Connecto ...

  3. 关于CMNET和CMWAP联网实践

    在j2medev上见到一篇关于CMNET和CMWAP网络连接.   现在我根据我的实际经验总结下它们. 1.CNNET,这个就不用怎么样介绍了,跟电脑上Internet没什么区别. 直接用这个这样的代 ...

  4. CMNET和CMWAP的区别和适用范围

    在论坛上泡了一段时间,发现很多朋友对CMWAP和CMNET的区别还是不甚了解.对于一些新软件,经常有人会问"CMWAP可以用吗?",希望本文来能为大家解开这个疑惑. 如果你是一个菜 ...

  5. cmnet 和 cmwap 收费等区别

    要了解资费的区别,首先要了解这两种方式的不同: 1,区别 CMNET和CMWAP是中国移动GPRS网络的两个不同APN(接入点名称),之所以这样分类是以控制为目的.CMNET提供了NAT服务,使用该服 ...

  6. CMNET和CMWAP区别

    CMWAP 和 CMNET 只是中国移动人为划分的两个GPRS接入方式.前者是为手机WAP上网而设立的,后者则主要是为PC.笔记本电脑.PDA等利用GPRS上网服务.它们在实现方式上并没有任何差别,但 ...

  7. 中国移动CMnet和CMwap两种网络的区别?

    中国移动CMnet和CMwap两种网络的区别? 一.目的不同 CMwap是为手机wap上网设立的; cmnet是为手体电脑,掌上电脑等移动设备上互联网设立的; 二.实现方式不同 WAP应用采用的实现方 ...

  8. cmnet是什么 cmnet是什么意思?cmnet和cmwap的区别在哪里

    转载请说明来源于"厦门SEO" 本文地址:http://www.96096.cc/Article/161412.html cmnet是什么 您可能感兴趣的话题: cmnet 核心提 ...

  9. cmnet与cmwap区别

    1,区别 CMNET和CMWAP是中国移动GPRS网络的两个不同APN(接入点名称),之所以这样分类是以控制为目的.CMNET提供了NAT服务,使用该服务的手机可以直接访问internet.CMWAP ...

最新文章

  1. ASP.NET MVC笔记
  2. oracle协议适配器错误00530,oracle监听程序无法启动(TNS-12560: TNS: 协议适配器错误,TNS-00530: 协议适配器错误)...
  3. javascript --- 类、class、事件委托的编程风格
  4. 前端学习(1362):学生档案信息管理4
  5. mysql主从同步触发器_Mysql 主从复制触发器问题
  6. map和unordered_map
  7. 计算机系统结构自考知识点总结,自考《计算机系统结构》问答题总结(3)
  8. sql server完全卸载
  9. 操作系统 | Linux基础教程
  10. “女生当程序员?”你们骂我,我也要说!
  11. 你根本就不会使用Notes!
  12. 多平台的敏感信息监测工具-GShark
  13. android将pdf文件转换成Bitmap,并将bitmap以图片的 方式保存到相册。
  14. linux /sys目录下的各个子目录说明
  15. AMOS分析技术:独立模型、饱和模型和假设模型
  16. html 穿越星空效果,html5 canvas绚丽3d星空飞行穿梭动画特效
  17. Dilworth定理是个啥东东
  18. 列几点一些软件或APP的Bug和对其建议
  19. 乐忧商城项目总结-1
  20. Linux C/TCP多线程网络聊天室

热门文章

  1. php生成sn码,PHP 生成SN码
  2. 二招搞定word文档中的乱码
  3. 用户画像(profile v.s. persona)
  4. 关于身份认证和鉴权过程
  5. 不讲武德!为击破苹果的“隐私高墙”,谷歌、Facebook 竟然“二打一”?
  6. 空气质量指数c语言,基于STM32的小范围空气质量的监测与预报
  7. 流氓不可怕,就怕流氓有文化 Re: 人穷怪物瘠,拉不出屎怪茅坑
  8. Diffusion model知识笔记
  9. CocosCreator之Animation动画组件
  10. cdr2022订阅版 全新版本新功能体验CorelDRAW2022