转自: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 切换APN相关推荐

  1. android cmwap 切换 cmnet,Android CMWAP和CMNET 切换APN

    转自:http://seya.iteye.com/blog/897576 有的中国移动的业务需要走CMWAP接入点才能够连接网络的,在做这类应用的时候,不可避免地需要判断当前APN, 切换APN,以及 ...

  2. android CMWAP, CMNET有何区别

    什么是CMNET,什么是CMWAP? 答:CMWAP和CMNET只是中国移动为其划分的两个GPRS接入方式.中国移动对CMWAP作了一定的限制,主要表现在CMWAP接入时只能访问GPRS网络内的IP( ...

  3. android CMWAP CMNET

    android CMWAP CMNET CMWAP和CMNET是中国移动为其划分的两个GPRS接入方式. CMWAP CMWAP接入时只能访问GPRS网络内的IP(10...*)网络, 而无法通过路由 ...

  4. 什么是 APN、CMWAP、CMNET?

    在用手机设置 GPRS 上网的过程中,需要配置一下"接入点",即所谓 APN (access point name). 照我的理解,所谓配置 APN 就是选择一个"接入服 ...

  5. Android手机上网、彩信APN设置

    Android手机上网.彩信APN设置 Godaddy最新域名优惠码 -  帅哥推荐博客主机 -  linost圣诞促销返款 -  iPhone4销售状态查询 前几天师弟跑来问我G2(Magic)怎么 ...

  6. Android 系统(169)---Android 7.0 插卡后APN信息的加载流程

    Android 7.0 插卡后APN信息的加载流程.UI界面编辑APN的流程及Android中APN配置相关的漏洞 终端中有一个apns-config.xml文件,负责定义各个运营商规定的默认APN参 ...

  7. Android 7.0 插卡后APN信息的加载流程、UI界面编辑APN的流程及Android中APN配置相关的漏洞

    终端中有一个apns-config.xml文件,负责定义各个运营商规定的默认APN参数. 开机后,终端启动Phone进程时,会加载运行在Phone进程中的TelephonyProvider. Tele ...

  8. CMWAP 和 CMNET 的主要区别与适用范围

    (1) 为什么会有两个接入点? 在网上查阅大量资料后并经过反复的尝试与探索后,我大致对中国移动提供的这两种接入方式有了初步了解. 在国际上,通常只有一种GPRS接入方式,为什么在中国会有CMWAP和C ...

  9. [转载]windows mobile中区分cmwap或cmnet接入点

    我在之前的一篇文章中谈到了使用网络接入点的问题:http://blog.csdn.net/pknife/archive/2008/05/21/2467602.aspx,另外的一篇文章演示了如何创建cm ...

最新文章

  1. WZ132源代码有的在运果子
  2. LightOj_1265 Island of Survival
  3. 思科cisco路由器动态路由协议配置方法
  4. 多线程编程-工具篇-BlockingQueue
  5. linux下各文件夹的作用
  6. Windows10配置maven环境变量(图文教程)
  7. PDE5 method of characteristics
  8. 《MFC游戏开发》笔记十 游戏中的碰撞检测进阶:地图类型障碍物判定
  9. N个例子让你彻底理解java接口回调
  10. 【二极管】稳压二极管全面分析
  11. android金钱符号变形,使用¥(一个中文字宽)还是¥(半个中文字宽)?
  12. linux驱动-设备驱动模型
  13. 美元指数K线图怎么看?
  14. 单片机的调试接口 JTAG SWD
  15. 速览 NFT 期权赛道代表项目与发展前景
  16. IOS 文本操作笔记——CHARACTERSET
  17. [NIKON D80]校园中的日落
  18. 监控--智能视频分析技术与被动红外技术的整合应用
  19. 【Python语言基础】——Python NumPy 入门
  20. keil c语言 位运算,c51按位运算符

热门文章

  1. Hello World的正确打zhuang开bi方式———lambda表达式
  2. 如何做好网站页面的交互设计?
  3. win7用计算机名共享打印机,win7共享打印机需要输入用户名和密码该怎么办啊?...
  4. oracle版linux查看rac ip,oracle10g RAC中查看Private IP的方法
  5. 弄底层基础的东西往往慢,枯燥,要慢慢磨
  6. 如何使用 Google 的 AutoAugment 改进图像分类器
  7. 指令集CEO潘爱民受聘为之江实验室智能计算数字反应堆首席架构师
  8. 微信小程序使用腾讯位置服务地图选点实现地址的选取|微信小程序腾讯位置服务地图选点请求来源未被授权
  9. 2013手机游戏引擎趋势:竞争升级
  10. 丑数_题目1214:丑数