文档章节

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

SuShine
 SuShine
发布于 2015/06/24 13:55
字数 927
阅读 7
收藏 0
点赞 0
评论 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
粉丝 118
博文 436
码字总数 88684
作品 0
青岛
后端工程师
android网络类型 wap代理设置

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

caikezhan ⋅ 2012/07/19 ⋅ 1

Android中使用cmwap接入点访问互联网的问题及解决办法

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

无鸯 ⋅ 2011/09/08 ⋅ 0

web网站,android手机通过wap方式无法访问,WIFI可以

一个自己搭建的web网站,放到公网后,通过浏览器,可以在公网上访问到自己的网站。可是android手机端通过浏览器通过cmwap、cmnet都无法正常访问,但是用WIFI就可以打开web网站的内容!求解。...

claylee ⋅ 2013/05/19 ⋅ 4

Android开发之APN网络切换

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

james_laughing ⋅ 2014/10/15 ⋅ 0

Android 监听网络的变化

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

caikezhan ⋅ 2012/07/24 ⋅ 1

Android WIFI,cmwap,cmnet 链接自动切换

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

无鸯 ⋅ 2011/09/08 ⋅ 1

CMWAP和CMNET终极大比较

CMWAP和CMNET终极大比较用手机上网已经有好长一段时间了,每次在和朋友交流经验时,总会发现很多朋友对CMWAP和CMNET的区别还是不甚了解。对于一些新软件,经常有人会问“CMWAP可以用吗?”,...

晨曦之光 ⋅ 2012/05/21 ⋅ 0

Android开发3g、wap、net的区别

1.通过CMNET可以获得完全的Internet访问权,可以访问pop和imap等众多互联网服务; 2.通过CMWAP只能访问网页,无法访问pop和imap等众多互联网服务。 (1) 为什么会有两个接入点?   在国际上...

TedYin ⋅ 2013/11/12 ⋅ 1

Windows Mobile 开发系列文章收藏 - GPRS/上网设置

Windows Mobile 开发系列文章收藏 - GPRS基础知识/应用开发/上网设置. GPRS入门知识 GPRS、WAP、CDMA GPRS网络总体结构 GPRS基本知识问答 GPRS类型一览 GPRS简介 GPRS特点 GPRS开发系列文章 ...

长征2号 ⋅ 2017/09/08 ⋅ 0

android KSOAP2解析调用webservice手机网络无法调用

RT android KSOAP2解析调用webservice手机网络无法调用,wifi net网络是可以 测试移动网络cmnet,cmwap。无法访问webservice。。 谁遇到过这样的问题?有什么解决方案呢?...

using ⋅ 2012/12/15 ⋅ 5

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周六乱弹 —— 假如你被熊困到树上

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》 《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》- 谢...

小小编辑 ⋅ 23分钟前 ⋅ 2

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 今天 ⋅ 1

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部