文档章节

Android上如何正确实现程序的联网,事关WIFI/CMWAP/CMNET

SuShine
 SuShine
发布于 2015/06/24 13:55
字数 927
阅读 7
收藏 0

我想很多Android程序开发者都曾碰到过这样的问题,那就是如何让自己的程序在国内如此复杂的网络环境下顺利的接上网络,给我们的用户一个更好的体验。 
从网络上一些已有的数据来看,Android手机用户群体的联网率普遍比较高,联网的方式非常多样,最多的还是使用WIFI,当然WIFI速度和资费上的优势让她成为了每一个玩机者的首选网络接入方式,但是很多的时候我们的条件并不是那么的尽如人意。例如在公车或地铁上,我们这些诸多支付不起3G资费的人士,首选的接入方式依然是CMWAP/CMNET,而由于国内网络的一些个问题,选择这两个或者其他的APN会有一些问题,问题就是我们可能需要设置代理才可以顺利登录网络。 

以下是我自己在网络上寻找解决方案的时候,收集的一些信息,记录如下: 

    WAP是一中手机上网的协议。CTWAP是中国电信的WAP接入名称(China Telecom WAP),CMWAP是中国移动的WAP接入名称(China Mobile WAP),  UNIWAP是联通的WAP接入名称(china Unicom WAP),  另外CTNET/CMNET/UNINET同上。 
    CTWAP的上网网关:10.0.0.200:80 
    CMWAP的上网网关:10.0.0.172:80 
    UNIWAP使用的网关与CMWAP一致 

我们可以通过MCC+MNC码的方式来进行简单的判断,但是实际上这种方式并不是完全正确的方法(自己在项目上碰到了该问题,因为实际情况中我们总是需要面对多种网络的情况)。这个时候其实我们可以稍微Hack一下,虽然Android并没有提供非常好的API,不过我们可以通过一些方法绕过去这里有一篇非常不错的文章http://www.javaeye.com/topic/565662 ,讲解得还算全面。 
下面给出我自己的解决方案: 

WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
  HttpClient httpClient = new DefaultHttpClient(); 
  if(!wifiManager.isWifiEnabled()){ 
   Uri uri = Uri.parse("content://telephony/carriers/preferapn"); //获取当前正在使用的APN接入点 
   Cursor mCursor = this.getContentResolver().query(uri, null, null, null, null); 
   if(mCursor != null){ 
    mCursor.moveToNext(); //游标移至第一条记录,当然也只有一条 
    String proxyStr = mCursor.getString(mCursor.getColumnIndex("proxy")); 
    if(proxyStr != null && proxyStr.trim().length() > 0){ 
     HttpHost proxy = new HttpHost(proxyStr, 80); 
     httpClient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, proxy); 
    } 
   } 
  } 
  HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), 20 * 1000); 
        HttpConnectionParams.setSoTimeout(httpClient.getParams(), 20 * 1000); 
        HttpGet httpGet = new HttpGet(wrapGetUrl()); 
try 
        { 
            HttpResponse response =httpClient.execute(httpGet); 
            if(response.getStatusLine().getStatusCode() == 200){ 
             HttpEntity entity = response.getEntity(); 
             InputStream content = entity.getContent(); 
             BufferedInputStream bis = new BufferedInputStream(content); 
             StringBuilder builder = new StringBuilder(); 
             int b; 
             while((b=bis.read()) != -1){ 
              builder.append((char)b); 
             } 
             String resultStr = builder.toString(); 
               Log.v("result", resultStr); 
}catch(Exception e){ 
}finally{ 
httpClient.getConnectionManager().shutdown(); 


该方案在打开WIFI/CMWAP/CMNET的情况下均单独测试成功。 
同理HttpPost也可以如法炮制,下面附上一段代码: 

int version = 3; 
  Class versionClass = VERSION.class; 
  TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 
  WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
  String manufacturer = ""; 
  String device = ""; 
  String networkOperatorName = tm.getNetworkOperatorName(); 
  String IMEI = tm.getDeviceId(); 
  try { 
   Field field = versionClass.getField("SDK_INT"); 
   version = (Integer) field.get(new VERSION()); 
   Class buildClass = Build.class; 
   Field manu_field = buildClass.getField("MANUFACTURER"); 
   manufacturer = (String) manu_field.get(new android.os.Build()) + " "; 
   Field deviceField = buildClass.getField("DEVICE"); 
   device = (String) deviceField.get(new Build()); 
  } catch (Exception e) { 

  } 
  HttpClient httpclient = new DefaultHttpClient(); 
  try { 
   if(!wifiManager.isWifiEnabled()){ 
    Uri uri = Uri.parse("content://telephony/carriers/preferapn"); 
    Cursor mCursor = this.getContentResolver().query(uri, null, null, null, null); 
    if(mCursor != null){ 
     mCursor.moveToNext(); 
     String proxyStr = mCursor.getString(mCursor.getColumnIndex("proxy")); 
     if(proxyStr != null && proxyStr.trim().length() > 0){ 
      HttpHost proxy = new HttpHost(proxyStr, 80); 
      httpclient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, proxy); 
     } 
    } 
   } 
   HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), 20 * 1000); 
            HttpConnectionParams.setSoTimeout(httpclient.getParams(), 20 * 1000); 
   HttpPost httppost = new HttpPost("YOUR_POST_URL"); 
   List nameValuePairs = new ArrayList(); 
   nameValuePairs.add(new BasicNameValuePair("os", "Android")); 
   nameValuePairs.add(new BasicNameValuePair("os_version",String.valueOf(version))); 
   nameValuePairs.add(new BasicNameValuePair("device", manufacturer+device)); 
   nameValuePairs.add(new BasicNameValuePair("uuid", md5(IMEI))); 
   nameValuePairs.add(new BasicNameValuePair("network", networkOperatorName)); 
   httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8)); 
   HttpResponse response; 
   response = httpclient.execute(httppost); 
   httpclient.execute(httppost); 
   StatusLine statusLine = response.getStatusLine(); 
   if(statusLine.getStatusCode() == 200){ 
Toast.makeText(this, R.string.updatesucceed, Toast.LENGTH_SHORT).show(); 
   }else{ 
Toast.makeText(this, R.string.updatefailed, Toast.LENGTH_SHORT).show(); 
   } 
  } catch (UnsupportedEncodingException e) { 
   e.printStackTrace(); 
  } catch (ClientProtocolException e) { 
   e.printStackTrace(); 
  } catch (IOException e) { 
   e.printStackTrace(); 
  }finally{ 
   updateFlag = true; 
   httpclient.getConnectionManager().shutdown(); 
  }

本文转载自:http://blog.csdn.net/sfshine/article/details/8521019

共有 人打赏支持
SuShine
粉丝 123
博文 504
码字总数 148653
作品 0
朝阳
后端工程师
android网络类型 wap代理设置

1、很多人都知道移动提供的两个不同的接入点,即:CMWAP 和 CMNET ,前者是为手机WAP上网而设立的,后者则主要是为PC、笔记本电脑、PDA等利用GPRS上网服务的。它们在实现方式上并没有任何差别...

caikezhan
2012/07/19
0
1
Android开发之APN网络切换

本文介绍Android平台中关于APN网络切换的相关知识以及如何实现APN切换。   由于最近的项目中用到APN切换的功能,所以就借着这个机会介绍一下APN的相关知识及如何在Android实现切换过程。关...

james_laughing
2014/10/15
0
0
Android 监听网络的变化

Android中网络情况时有变化,比如从有网到没网,从wifi到gprs,gprs又从cmwap到cmnet...等等! 如果你的程序有些功能是需要网络支持的,有时候就需要监听到网络的变化情况进行相应的处理。 ...

caikezhan
2012/07/24
0
1
Android中使用cmwap接入点访问互联网的问题及解决办法

//检查网络 是否正常 ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); netWrokInfo = manager.getActiveNetworkInfo(); return true; /** *......

无鸯
2011/09/08
1K
0
用iptables实现G1手机cmwap代理上http网站[转]

折腾了几天,总算有点阶段性成果: 证实可以用iptables实现通过cmwap的代理上HTTP协议的网站。 首先,android系统的实现是有缺陷的。在接入apn中指定的proxy并不会被系统所用。好似只有浏览器...

kevin.gan
2010/01/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
27
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部