文档章节

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

SuShine
 SuShine
发布于 2015/06/24 13:55
字数 927
阅读 8
收藏 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
博文 538
码字总数 153323
作品 0
朝阳
后端工程师
私信 提问
android网络类型 wap代理设置

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

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

/** *Android 使用cmwap GPRS 方式联网 */ CMWAP和CMNET只是中国移动为其划分的两个GPRS接入方式。中国移动对CMWAP作了一定的限制,主要表现在CMWAP接入时只能访问 GPRS网络内的IP(10.*.*....

无鸯
2011/09/08
1K
0
web网站,android手机通过wap方式无法访问,WIFI可以

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

claylee
2013/05/19
1K
4
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分辨率,屏幕尺寸,屏幕密度关系

名词定义分辨率分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏幕常见的分辨率有480×800、720×1280、1080×1920等。720×1280表示此屏幕在宽度方向有720个像素...

GoldenVein
13分钟前
1
0
inux驱动的异步通知(kill_fasync,fasync)---- 驱动程序向应用程序发送信号

===========================应用程序========================= #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <poll.h> #include <sign......

天王盖地虎626
14分钟前
1
0
使用android studio时,ADB连接不上手机可能性之一

问题描述:as是通过adb连接手机进行调试了,如果电脑装了鲁大师,360等软件,可能会存在adb被这些软件占用的情况,所以会连接不上手机。这种解决方案有很多,比如通过任务管理器查看是谁占用...

白话
17分钟前
1
0
node实践--node集体管理工具PM2入门指南

来自PM2实用入门指南 简介 PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。 下面就对PM2进行入门性的介绍,基本...

spinachgit
22分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部