`
mengsina
  • 浏览: 191483 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
转自:http://www.7dot9.com/2010/07/android%E4%B8%8A%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E5%AE%9E%E7%8E%B0%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%81%94%E7%BD%91/

我想很多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();
  }

分享到:
评论
3 楼 mengsina 2011-08-03  
kirin 写道
https连接验证了吗,我发现cmwap/3gwap下连接https有问题

不好意思,我没有验证。是直接转载过来的。
2 楼 kirin 2011-08-02  
https连接验证了吗,我发现cmwap/3gwap下连接https有问题
1 楼 tanghanlin 2011-06-20  
   

相关推荐

    使用Android实现联网

    在Android平台上,实现联网功能是一项关键任务,这使得应用程序能够与互联网交互,接收和发送数据。Android提供了丰富的API和工具来支持网络编程,使其成为开发联网应用的理想选择。以下是对Android联网功能的详细...

    程序联网控制 程序上网控制软件 控制程序联网

    "程序联网控制"就是这样的一个工具,它允许用户对计算机上的应用程序进行精细化的网络访问管理。这款"程序联网控制软件"旨在提供一种简单易用的方式,让用户能够自由地决定哪些程序可以连接到互联网,哪些则不能。 ...

    Android Studio实现天气预报小程序

    在Android Studio中实现一个天气预报小程序,涉及到许多关键的Android开发技术。首先,我们需要了解Android Studio作为集成开发环境(IDE)的基本使用,包括项目创建、布局设计、代码编写以及调试等流程。 1. **...

    wifi声波联网android demo

    标题中的“WiFi声波联网Android Demo”是一种技术实现方式,主要应用于移动设备,尤其是Android操作系统上的应用程序。这种技术利用声波来传输数据,比如网络连接信息,使得设备可以通过声音进行WiFi连接,无需手动...

    运用_Android_实现联网

    Android平台为开发者提供了丰富的网络功能,使其能轻松实现应用程序的联网功能。主要的联网方式包括使用WIFI和GPRS两种,适用于各种网络环境。Android平台的网络功能基于Linux内核,提供了多样的API包供开发者使用。...

    Android 判断联网状态

    在Android开发中,判断设备联网状态是至关重要的,这关系到应用能否正常访问网络资源,如下载数据、发送请求或接收推送。以下是一篇详细解释如何在Android中判断WIFI和GPRS(2G/3G)联网状态的教程。 首先,我们...

    小程序基础联网请求实现

    在微信小程序开发中,基础联网请求是至关重要的功能,它使得小程序能够与服务器进行数据交互,展示或更新用户界面。本项目"小程序基础联网请求实现"提供了一个简单易学的示例,帮助开发者理解如何在小程序中进行网络...

    在Android平台下利用WiFi技术实现

    Wifi无线传输数据需要我们使用Android系统手机才能进行,如何才能利用WiFi来实现Android手机与PC电脑或手机进行无线传输数据,这里我们就来搭建FTP传数据,具体操作步骤如下: 设置WiFi无线登录 设置你的Android...

    Android 局域网斗地主加单机

    本文将深入探讨如何实现“Android局域网斗地主”功能,特别是通过WiFi热点共享进行局域网对战以及单机模式的设计和实现。我们将从以下几个方面展开讨论: 1. **Android局域网通信基础** 在Android系统中,实现...

    易语言禁止指定程序联网源码

    这个"易语言禁止指定程序联网源码"是一个用易语言编写的程序,它的主要功能是阻止用户计算机上的特定程序进行网络连接。这样的工具在某些场景下非常有用,比如企业环境中可能需要限制员工使用某些软件访问互联网,...

    androidwifi框架简介收集.pdf

    1. Java 应用层:位于 packages/apps/Settings/src/com/android/settings/wifi/WifiSettings.java&WifiEnabler.java,负责 WIFI 设置和 WIFI 启用。 2. Java Framework 层:位于 frameworks/base/services/java/...

    Android开发从入门到精通6-使用Android实现联网.doc

    ### Android开发从入门到精通6-使用Android实现联网 #### Android平台概述及联网特性 Android作为一款面向应用程序开发的丰富平台,不仅提供了出色的用户界面元素和数据管理功能,还为开发者构建连接到真实世界的...

    c/s架构实现联网更新程序

    1-解决软件升级版本的苦恼 2-实现客户端联网自动更新软件

    基于Android平台的车联网系统的设计与实现.pdf

    车联网技术是近年来快速发展的一种智能化汽车技术,它通过整合汽车、网络和计算机技术,实现...他的研究工作在一定程度上推动了基于Android平台车联网系统设计与实现的进步,为该领域的研究与实践提供了参考与借鉴。

    程序设计大作业基于Qt实现的联网对战不围棋源码.zip

    程序设计大作业基于Qt实现的联网对战不围棋源码.zip程序设计大作业基于Qt实现的联网对战不围棋源码.zip程序设计大作业基于Qt实现的联网对战不围棋源码.zip程序设计大作业基于Qt实现的联网对战不围棋源码.zip程序设计...

    禁止某个目录下的所有exe程序联网.bat

    禁止某个目录下的所有exe程序联网

Global site tag (gtag.js) - Google Analytics