android CMWAP, CMNET有何区别

什么是CMNET,什么是CMWAP?

答:CMWAP和CMNET只是中国移动为其划分的两个GPRS接入方式。中国移动对CMWAP作了一定的限制,主要表现在CMWAP接入时只能访问GPRS网络内的IP(10.*.*.*),而无法通过路由访问Internet,我们用CMWAP浏览Internet上的网页就是通过WAP网关协议或它提供的HTTP代理服务实现的。 因此,只有满足以下两个条件的应用才能在中国移动的CMWAP接入方式下正常工作:

1.应用程序的网络请求基于HTTP协议。

2.应用程序支持HTTP代理协议或WAP网关协议。

这也就是为什么我们的G1无法正常用CMWAP的原因。

一句话:CMWAP是移动限制的,理论上只能上WAP网,而CMNET可以用GPRS浏览WWW。

首先判断是Wifi还是Mobile,如果是Mobile 有两种,一种是cmwap,另一种是cmnet。如果是cmwap ,则需要设置代理才能连接。

ConnectivityManager conManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

//mobile 3G Data NetworkState

mobile =conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();

//wifi State

wifi =conManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();

ConnectivityManager conManager =(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

//mobile 3G Data NetworkState

mobile = conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();

//wifi State

wifi = conManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();

取得网络链接

     ConnectivityManager conManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

//mobile 3G Data NetworkState

mobile = conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();

//wifi State

wifi = conManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();

ConnectivityManager conManager= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

//mobile 3G Data NetworkState

mobile = conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();

//wifi State

wifi = conManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();

有时候需要实现cmwap和cmnet两种接入方式转换,我自己就遇到过这个问题,经过在网上及查找资料,可以通过程序修改apn表,就可以改变接入方式,但是转换结束后,我测试了一下,大概需要6-8秒的时间,网上说是4秒,不知道他们怎样测试的,

修改原理,android将apn保存到数据库表,具体位置,进入android
root目录,/data/data/com.android.providers.telephony/datebase/telephony.db/carriers  打开后就可以看到里边的值了,这个表中保存着所有手机支持的网络接入方式,不同的生产商,及同一个生产商的不同手机型号,里边的值不一样,不过最基本的几个还是从在的,比如移动,联通等。
表中有个字段为current的,这个值如果为1,说明是当前的链接方式,但是感觉不对,因为我自己的机子老是有三到四个值为1的,通过分析感觉更像是当前网络可以选择的链接方式,比如我用的是移动的,所有移动的联网方式都为1.,如果有知道的可以分享一下,

我们修改apn接入方式时,其实并不是修改这个表,这也是这表为什么不保存当前网络连接方式的原因,而真真保存当前网络连接方式的是在xml文件中,位置是:/com.android.providers.telephony/shared_prefs/preferred-apn.xml中,文件的内容大概是<map>
<long name="apn_id" value="261"/></map>,apn_id是标签名,values值为上面提到的表的_id。表示当前正在使用这个方式接入网络

ok,那我们就明白要怎样做了吧?首先从表中查找到cmwap对应的id,查询方式一般为like ‘%cmwap%‘,找到以后将上面提到的xml文件的values值修改为查找到的就ok了,

下面是具体实现,(写的时候有几个字段名折腾了好久,感觉不安常规出牌)

public
class 
UpdateAPN{

public String
current;

public String
name;

private
Uri uriApn;

private
Uri uriNowApn;

public UpdateAPN() {

this.uriApn =
Uri.parse("content://telephony/carriers");

this.uriNowApn =
Uri.parse("content://telephony/carriers/preferapn");

this.name =
"cmnet";

this.current =
"1";

}

private String getAPN(){

String str1 = null;

ContentResolver localContentResolver =
AppInfo.globalAppContext.getContentResolver();

Cursor localCursor = localContentResolver.query(this.uriApn,
null,
"apn LIKE‘%cmnet%‘  ", null,
null);

if (localCursor ==
null){

return
null
;

}

for (localCursor.moveToFirst();!localCursor.isAfterLast(); localCursor.moveToNext()){

String apnName = localCursor.getString(localCursor.getColumnIndex("apn")).toLowerCase();

if (name.equals(apnName)){

int m =localCursor.getColumnIndex("_id");

str1 =localCursor.getString(m);

return str1;

}

}

localCursor.close();

return
null
;

}

private String getNowApn() {

String str1 = null;

ContentResolver localContentResolver =
AppInfo.globalAppContext.getContentResolver();

Uri localUri =
this
.uriNowApn;

Cursor localCursor = localContentResolver.query(localUri,
null, null,
null, null);

while (true) {

if ((localCursor ==
null) ||(!localCursor.moveToNext())) {

localCursor.close();

return str1;

}

int i = localCursor.getColumnIndex("_id");

str1 = localCursor.getString(i);

Constant.debug("getNowApn --> str1=" + str1);

return str1;

}

}

public
boolean 
updateApn(){

try {

String str1 = getAPN();//列表id
cmnet

String str2 = getNowApn();//当前连接id
cmwap

Constant.debug("apn---> " + str1 +" & nowApn ---> " + str2);

if (str1.equals(str2))

return
false
;

ContentResolver localContentResolver =
AppInfo.globalAppContext.getContentResolver();

ContentValues localContentValues =
new ContentValues();

String str3 = getAPN();//列表id
cmnet

localContentValues.put("apn_id", str3);

Uri localUri =
this.uriNowApn;

int i = localContentResolver.update(localUri,

localContentValues,
null
, null);

return
true
;

catch (Exception localException) {

String str4 = String.valueOf(localException);

int j =
Log.v("pleaseset cmwap‘s apn", str4);

return
false
;

}

}

}

下面大概测试,

首先判断网络是否cmwap链接,这个应该都会,所以不说了,

如果是cmwap,则进行切换,

切换结束后,然后重复判断网络是否可以连接

NetworkUtils类如下

public
class
NetworkUtils{

//cmwap转换cmnet

public
static boolean

cmwap2Cmnet(Contextcontext){

return
new
UpdateAPN().updateApn();

}

//是否是cmwap网络连接

public
static boolean

isCmwap(Contextcontext) {

if (context==
null) {

return
false
;

}

ConnectivityManager cm =(ConnectivityManager) context

.getSystemService(Context.CONNECTIVITY_SERVICE);

if (cm ==
null) {

return
false
;

}

NetworkInfo info =cm.getActiveNetworkInfo();

if (info ==null) {

return
false
;

}

String extraInfo =info.getExtraInfo();

//                    Constant.debug("extraInfo---> " + extraInfo);

//工具类,判断是否为空及null

if (TextUtils.isEmpty(extraInfo)|| (extraInfo.length() < 3)) {

return
false
;

}

if(extraInfo.toLowerCase().indexOf("wap") > 0){

return
true
;

}

//return extraInfo.regionMatches(true, extraInfo.length() - 3, "wap",

// 0,3);

return
false
;

}

/**

*
是否是cmnet链接网络

*
@return
ture是,false否

*/

public
static boolean

isCmnet(Context context) {

ConnectivityManager cm =(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

if (cm ==
null) {

return
false
;

}

NetworkInfo info =cm.getActiveNetworkInfo();

if (info ==null) {

return
false
;

}

String extraInfo = info.getExtraInfo();

if (TextUtils.isEmpty(extraInfo)|| (extraInfo.length() < 3)) {

return
false
;

}

if(extraInfo.toLowerCase().indexOf("net") > 0){

return
true
;

}

return
false
;

}

}

public
void
cmwap2Cmnet(){

//
如果为cmpwap,启动networkutils是我自己的网络连接工具类,你可以定义为自己的,也可以用方法替换,

if(NetworkUtils.isCmwap(this)) {

boolean s =NetworkUtils.cmwap2Cmnet(this);

if(NetworkUtils.isNetworkAvailable(this)){

Constant.debug("切换结束,网络可以连接");

}

longstartTime = System.currentTimeMillis();

int count =0;

while(!NetworkUtils.isCmnet(this)) {

//
cmwap切换到cmnet需要大概4秒的时间,只有切换过去,才结束

if (count>= 10) {

break;

}

try{

Thread.sleep(1000);

}catch(Exception e) {

}

count++;

}

long endTime= System.currentTimeMillis();

Constant.debug("切换结束,切换花费时间为:" + ((endTime -startTime) / 1000.0) +
";切换循环次数(如果大于10可能没有切换成功):" + count);

if(NetworkUtils.isCmnet(this)) {

Constant.debug("切换结束,网络连接方式为cmnet");

}

}

android CMWAP, CMNET有何区别,码迷,mamicode.com

时间: 2024-12-28 20:34:00

android CMWAP, CMNET有何区别的相关文章

android CMWAP, CMNET有何差别

什么是CMNET,什么是CMWAP? 答:CMWAP和CMNET仅仅是中国移动为其划分的两个GPRS接入方式.中国移动对CMWAP作了一定的限制,主要表如今CMWAP接入时仅仅能訪问GPRS网络内的IP(10.*.*.*),而无法通过路由訪问Internet,我们用CMWAP浏览Internet上的网页就是通过WAP网关协议或它提供的HTTP代理服务实现的. 因此,仅仅有满足下面两个条件的应用才干在中国移动的CMWAP接入方式下正常工作: 1.应用程序的网络请求基于HTTP协议. 2.应用程序支

android开发人员要懂得问题答案

我在网上看了一下有些人在博客上提出一些什么android开发人员必须懂得问题,但是就是没有答案,所以我就把这些问题拷贝过来了,顺便也把所有的答案加上,为了让更多的开发人员快速的找到答案,谢谢! 下面的答案我都单独写了博客来做解答,直接点击连接就可以看到了. 1. 什么是ANR,如何避免ANR. 点击打开链接 2. 什么是FC?如何避免FC的发生,另外FC发生时如何捕获相应的uncaught exception? 点击打开链接 3. Asynctask的优缺点?能否同时并发100+asynctas

android一些面试题目

1.ListView怎么提高滑动效率 2.说下你做过项目的包的构架,(联网,解析,activity,database) 重点 3.加载大量图片怎么做(包括小图和查看大图) 怎么减少一次跟服务器的链接数,怎么做缓存, 4.onInterceptTouchEvent(),onTouchEvent()的关系 5.怎么在oncreate中大致计算一个view的高度(调一下view的measure,然后再getHeight就行了) 6.MessageQueue,Looper,handler的关系(重点)

android 手机网络接入点名称及WAP、NET模式的区别

移动 电信 联通 APN cmwap cmnet ctwap ctnet 3gwap uniwap 3gnet uninet设置 APN(Access Point Name),即“接入点名称”,用来标识GPRS的业务种类,目前分为两大类:CMWAP(通过GPRS访问WAP业务).CMNET(除了WAP以外的服务目前都用CMNET,比如连接因特网等). 中国移动APN: cmwap (2G) cmnet (3G)中国电信APN: ctwap (2G) ctnet (3G)中国联通APN: uniw

Android 手机设置CMWAP 接入点

Android 手机设置CMWAP 接入点 设置--- 无限控件---移动网络设置---接入点名称----再按菜单---选择新apn 第一步,设置CMNET 上网APN 新建 APN 1.名称:cmnet 2.APN:cmnet 3.APN 类型:default 就仅仅填写上面 3 个选项,其它都是默认,不用填写. 保存后,你会发现,APN 里面就有cmnet 了,并且后面有个小圆点. 非常多朋友就是忘了最后一步的 APN 类型,没写default,所以才出问题的. 第二步,设置彩信 新建 AP

Android程序中的notifyDataSetInvalidated()和notifyDataSetChanged()有何区别

notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容. public void notifyDataSetChanged () 该方法内部实现了在每个观察者上面调用onChanged事件.每当发现数据集有改变的情况,或者读取到数据的新状态时,就会调用此方法. 例如,我们在新浪微博中,要进行分显示刷新微博. public void notifyDataSetInvalidated () 该方法内部实现了在每个观察

Android代码中实现WAP方式联网(转载!)

转载地址:http://www.linuxidc.com/Linux/2012-08/67980.htm 学习中,用到的,记录下. 无论是移动.联通还是电信,都至少提供了两种类型的的APN:WAP方式和NET方式.其中NET方式跟WIFI方式一样,无需任何设置,可自由访问所有类型网站,而WAP方式,需要手机先设置代理服务器和端口号等信息,并且只能访问HTTP协议类型的网站. 1) 移动的WAP名称是CMWAP,NET名称是CMNET: 2) 联通的WAP名称是UNIWAP,NET名称是UNINE

Android开发之网络

很多初学Android开发的人员对网络这一点感觉很高大上,现在我就和大家分享一下我的学习心得. 就目前的Android手机来说,可能存在5种网络状态: ----无网络(这种状态可能是因为手机停机,网络没有开启,信号不好等原因) ----使用WIFI上网 ----CMWAP(中国移动代理) ----CMNET上网 ----2G/3G/4G上网 很多时候我们需要判断用户是否开启网络设置,通常通过ConnectivityManager类来判断网络连接是否存在. 获取网络状态: 那到底如何使用这个类呢?

6、android 网络编程

1.基于socket的用法 服务器端: 先启动一个服务器端的socket     ServerSocket svr = new ServerSocket(8989); 开始侦听请求 Socket s = svr.accept(); 取得输入和输出 DataInputStream dis = new DataInputStream(s.getInputStream()); DataOutputStream dos = new DataOutputStream(s.getOutputStream()