网络分为几种:wifi,移动网络(移动、联通、电信)
移动、联通的适配好处理,无非就是直连接和代理(10.0.0.172)
cmnet,3gnet,uninet,wifi都是不需要代理的,直接用地址访问网络即可
Cursor cursor = context.getContentResolver().query(PREFERRED_APN_URI,
new String[] { "_id", "apn", "proxy","mnc" }, null, null, null);
cursor.moveToFirst();
if (!cursor.isAfterLast()) {
String apn = cursor.getString(1);
if (apn.equalsIgnoreCase("cmnet") || apn.equalsIgnoreCase("3gnet") || apn.equalsIgnoreCase("uninet")
|| apn.equalsIgnoreCase("#777")) {
type = WIFIAndCMNET;
} else if (apn.equalsIgnoreCase("cmwap") || apn.equalsIgnoreCase("3gwap") || apn.equalsIgnoreCase("uniwap")) {
type = CMWAP;
}
}
今天用电信的定制机分别测试了移动,联通 2.5G的卡,电信3G的卡。
总结如下:
无论如何在机器上更改设置
String apn = cursor.getString(1);//这段代码返回的值永远是:#777,proxy的值:10.0.0.200
猜想是不是这电信的定制机在机器上已经把这些参数写死了。
问题就来了:因apn和proxy返回的值都一样,所以就区分不了是代理还是直连接。
导致的问题:电信定制机 + 移动2.5G的卡(cmwap)方式 = 程序访问不了网络
测过很多客户端,都是如此。
电信定制机 + 移动2.5G的卡(cmnet)方式 = 程序可以访问网络
想过用如下方法来解决问题,发现不行。代理字段返回的总是:10.0.0.200
cursor.moveToFirst();
if (!cursor.isAfterLast()) {
String apn = cursor.getString(1);
if (apn.equalsIgnoreCase("cmnet") || apn.equalsIgnoreCase("3gnet") || apn.equalsIgnoreCase("uninet")
|| apn.equalsIgnoreCase("#777")) {
String proxy = cursor.getString(2);
String mnc = cursor.getString(3);
if(proxy != null && proxy.equalsIgnoreCase("10.0.0.172")){
type = CMWAP;//适配电信定制机装移动联通的卡
}else{
type = WIFIAndCMNET;
}
} else if (apn.equalsIgnoreCase("cmwap") || apn.equalsIgnoreCase("3gwap") || apn.equalsIgnoreCase("uniwap")) {
type = CMWAP;
}
本以为联通的也是如此,没想到的是:电信定制机 + 联通2.5G的卡(wap、net)方式 = 程序可以访问网络
进一步调试得知:该种情况下,返回的proxy都是为空,代码中用直连接方式即可解决问题。
用中国电信3G的卡,无论手机上的设置是否代理,发现直接用不代理的方式对应的代码就可以保证程序可以访问网络,好奇怪,
当然也省事,不用去管电信的代理方式了。
NND,定制机怎么这么多毛病。
以上是通过测试所得,请高人指点。
------------------------------------
补充:安装包发出去后,陆续收到一些用户的投诉;
中国电信定制机 + 中国电信卡(3G) = 上不了网。
一开始很奇怪,以前用XT800适配过,没有问题。后来用其他机型测试得到原因:
1、接入点名返回的不是“#777”,是ctnet.
2、Cursor cursor = context.getContentResolver().query(PREFERRED_APN_URI,
new String[] { "_id", "apn", "proxy","mnc" }, null, null, null);
cursor.moveToFirst();
该处的cursor为空
用另一种方式解决问题:
Cursor c = context.getContentResolver().query(PREFERRED_APN_URI,null, null, null, null);
c.moveToFirst();
String user=c.getString(c.getColumnIndex("user"));
if(user.equalsIgnoreCase("ctnet")){
}