网络适配

网络分为几种: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")){

    }

 

 

 

 

你可能感兴趣的:(网络适配)