`
seya
  • 浏览: 361378 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

android APN切换cmwap实现

阅读更多
有的中国移动的业务需要走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中貌似不行。

分享到:
评论
9 楼 a455642158 2012-12-03  
就算监听到变成了cmwap还不行,还得监听网络连接状态State,不过就算state已经connected了也还是有时候连接失败……不过比不监听这个状态好一点。
8 楼 hacer9791 2011-07-31  
xt800 切换不了网络
7 楼 imain 2011-07-04  
楼主,mNChangeReceiver 这个变量是在什么地方定义的?起到什么作用?
forceCMWapConnection()这个函数在哪里调用?
6 楼 seya 2011-04-07  
we_42011 写道
updateDcdContent(mManRequest);\

兄弟,这句什么意思啊?

这个跟具体的业务有关, 与接入点切入无关, 可忽略。
5 楼 we_42011 2011-04-05  
updateDcdContent(mManRequest);\

兄弟,这句什么意思啊?
4 楼 seya 2011-03-17  
sht2130 写道
  if (mNChangeReceiver != null) {
    updateDcdContent(mManRequest);
    HwDcdCmService.this.unregisterReceiver(mNChangeReceiver);
    mNChangeReceiver = null;
}

你好,上面代码在调试的时候不通,这个地方有些疑惑,监控到apn的切换之后具体需要做什么样的操作呢,劳烦楼主帮忙解释一下,谢谢


应用需要使用的网络是cmwap, 那就必须等到切换成cmwap之后才去连接, 发起http请求。 这是apn切换之后要做的。
3 楼 sht2130 2011-03-15  
  if (mNChangeReceiver != null) {
    updateDcdContent(mManRequest);
    HwDcdCmService.this.unregisterReceiver(mNChangeReceiver);
    mNChangeReceiver = null;
}

你好,上面代码在调试的时候不通,这个地方有些疑惑,监控到apn的切换之后具体需要做什么样的操作呢,劳烦楼主帮忙解释一下,谢谢
2 楼 seya 2011-03-09  
startUsingNetworkFeature
Wesley.S 写道
兄弟,知道 startUsingNetworkFeature(type,value)的意义吗??

直接修改当前网络数据连接类型, 和通过设置当前APN的方式效果一样。不同的是设置里面选中的APN不会发生变化。 APN可能还是cmnet, 可是通过使用startUsingNetworkFeature(type,value), 使当前实际使用的网络切换为cmwap.
1 楼 Wesley.S 2011-03-04  
兄弟,知道 startUsingNetworkFeature(type,value)的意义吗??

相关推荐

    android apn切换程序

    "Android APN切换程序"是一个专门针对Android系统的应用,它允许用户方便快捷地在不同的APN设置之间切换,无需手动进入系统设置进行复杂的配置。这个程序特别适用于那些需要频繁更改APN设置的用户,例如移动网络调试...

    android APN开发流程

    ### Android APN开发流程详解 #### 一、数据连接机制概览 Android设备的数据连接机制主要依赖于PPP(Point-to-Point Protocol)协议,这是一套用于在点对点链路上进行数据传输的标准协议,适用于拨号电话、ISDN、X....

    Android端APN实现module

    本模块主要探讨的是如何在Android应用程序中通过代码来实现APN的配置。 在Android端实现APN配置涉及以下几个关键知识点: 1. **APN结构**:每个APN由多个字段组成,如名称、APN字符串、用户名、密码、代理服务器、...

    android APN 设置

    4. **切换APN**:在Android应用中,如果需要在`cmnet`和`cmwap`之间切换,可以通过修改当前激活的APN实现。`cmnet`通常用于高速互联网访问,而`cmwap`通常用于WAP浏览,它们的APN设置是不同的。通过调用`...

    android手机APN设置

    Android 手机 APN 设置 APN(Access Point Name)是移动网络中的一个重要概念,它是指移动网络中的一个访问点名称,用于标识移动网络中的一个访问点。Android 手机中的 APN 设置是指在 Android 手机中设置移动网络...

    Android APN开发流程分析.doc

    Android APN 开发流程分析是指 Android 操作系统中数据连接的实现过程,主要涉及到数据连接的建立、维护和管理。以下是 Android APN 开发流程分析的关键知识点: 1. 数据连接流程分析 Android 的数据连接是基于 ...

    android 全面解析apn

    Android 全面解析 APN APN(Access Point Name)是 GPRS 背bone 中的一个参考点,指向一个 GGSN(Gateway GPRS Support Node)。GGSN 是一个核心网络设备,负责将用户的数据流量转发到互联网上。APN 是一个字符串,...

    Android开发之系统信息【5】——获取APN列表

    Android 系统中对于 APN 的网络 API 没有公开,但是我们可以通过阅读源代码,然后进行数据库操作,系统会自动监听数据库的变化,从而实现开启或者关闭 APN。 APN(Access Point Name)是移动网络上的一个概念,指的...

    android中的APN开发

    在Android系统中,APN(Access Point Name)是网络连接的关键配置,用于定义设备如何接入互联网,特别是通过移动数据。APN包含了网络提供商的名称、数据类型、用户名、密码等信息,这些信息决定了手机如何通过运营商...

    设置APN节点,并切换到当前节点

    本项目中,我们关注的重点是如何在Android系统中设置APN,并且实现APN节点的切换,这对于网络服务的提供,特别是在企业级项目中,具有重要的实用价值。 首先,我们要理解APN的作用。APN包含了运营商信息、数据类型...

    Android APN文件装换为windowsphones8 APN文件

    由于Android的APN配置信息存储在一个文本文件中,通常命名为“apn.conf”或“apns-conf.xml”,而WP8系统则需要在系统设置内手动创建每个APN条目,这在APN数量众多的情况下非常不便。因此,有一个工具或方法能将...

    Android的APN开发源码分析

    ### Android的APN开发源码分析 #### 一、Android数据连接原理 Android的数据连接机制主要是基于PPP(Point-to-Point Protocol)的方式实现的。PPP协议是一种广泛使用的串行链路通信协议,它允许用户通过拨号或其他...

    android widget GRRS/3G(APN)上网开关

    不同的运营商可能有不同的APN设置,用户通常可以在手机的设置中手动调整,但通过小部件实现一键切换则更加便捷。 创建这样的小部件,我们首先需要在Android Studio中创建一个新的Android项目,选择“App Widget”...

    关于cmwap网络切换

    本教程将详细探讨如何在Android系统中进行CMWAP网络的切换和配置。 一、CMWAP网络简介 CMWAP是GPRS(General Packet Radio Service)网络下的一种接入点名称(Access Point Name,简称APN),它是中国移动为用户...

    Android apn 消息推送(server与client)

    然而,当我们谈论"Android APN消息推送"时,这指的是利用APN机制实现应用间的即时消息传递服务。在这个项目中,我们看到了三个主要组件:服务器端、客户端和一个演示应用,它们都是为了实现这种推送服务。 首先,`...

    android apn设置 A20 A83 RK3288 验证通过

    在Android系统中,APN(Access Point Name,接入点名称)是用于移动设备连接网络的重要配置,它定义了手机如何连接到互联网,包括使用的网络类型(如GPRS、3G、4G或5G)、数据服务提供商以及相关认证信息。...

    海卓APN切换开关_HIAPN_2[1].0.7.apk

    海卓APN切换开关_HIAPN_2[1].0.7.apk,能够实现手机APN的手动开关。

    AS 工程自定义 APN 实现.rar

    "AS 工程自定义 APN 实现.rar"提供的就是一个Android Studio项目,旨在帮助开发者创建和管理自定义的APN连接。 首先,我们要了解如何在Android系统中自定义APN。这通常涉及以下几个步骤: 1. **编写代码**:在...

    AndroidWIFI,CMWAP,CMNET的自动判断访问.pdf

    给出的代码片段展示了如何在Android中实现自动判断和切换APN的方法。以下是一些关键知识点: 1. **ConnectivityManager**: 这是Android系统中用来管理网络连接的服务,可以通过`getSystemService(Context....

    iphone APN切换器 APN Switcher

    iphone手机软件。可以在cmwap和cmnet切换,方便 再更改

Global site tag (gtag.js) - Google Analytics