无论是移动、联通还是电信,都至少提供了两种类型的的APN:WAP方式和NET方式。其中NET方式跟WIFI方式一样,无需任何设置,可自由访问所有类型网站,而WAP方式,需要手机先设置代理服务器和端口号等信息,并且只能访问HTTP协议类型的网站。

1) 移动的WAP名称是CMWAP,NET名称是CMNET;

2) 联通的WAP名称是UNIWAP,NET名称是UNINET;联通3G的WAP名称是3GWAP,NET名称是3GNET;

3) 电信的WAP名称是CTWAP,NET名称是CTNET;

其中,移动和联通的WAP代理服务器都是10.0.0.172,端口号是80;而电信的WAP代理服务器是10.0.0.200,端口号是80。

Android系统中,对于APN网络的API是隐藏的,因此获取手机的APN设置,需要通过ContentProvider来进行数据库查询,查询的URI地址是:

取得全部的APN列表:content://telephony/carriers;

取得当前设置的APN:content://telephony/carriers/preferapn;

取得current=1的APN:content://telephony/carriers/current;

下面我们的代码就是获取当前首选的APN设置,并继承HttpClient,实现我们自己的代理HttpClient类。首先来看下APN的管理类的实现,这个类的主要功能是获得APN的代理服务器和端口号,查询用的URI如下:

由这个URI使用ContentResolver获得游标对象,之后就是查询操作了,分别查处当前手机所设置的APN、Proxy和Port,而如果手机的Proxy没有设置,则需要根据APN来决定当前应该连接的代理服务器地址和端口号,详细代码如下所示:

通过APNManager类获取到当前手机的WAP设置的代理和端口之后,就可以构造我们自己的代理HttpClient了,这个类定义为ProxyHttpClient,在该类的构造函数中,首先获得APNManager的实例,然后获取代理服务器proxy和端口值port,通过这两个参数构造HttpHost实例,并将host实例设置为ConnRouteParams.DEFAULT_PROXY的值,详细代码截图如下所示:

APNManager类完整定义如下:

package com.hust.iprai;import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;public class APNManager {public static final Uri PREFERRED_APN_URI;private String mApn; // 接入点名称private String mPort; // 端口号private String mProxy; // 代理服务器private boolean mUseWap; // 是否正在使用WAPstatic {PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn"); // 取得当前设置的APN}public APNManager(Context context) {checkNetworkType(context);}/*** 获得当前设置的APN相关参数* @param context*/private void checkApn(Context context) {ContentResolver contentResolver = context.getContentResolver();Uri uri = PREFERRED_APN_URI;String[] apnInfo = new String[3];apnInfo[0] = "apn";apnInfo[1] = "proxy";apnInfo[2] = "port";Cursor cursor = contentResolver.query(uri, apnInfo, null, null, null);if (cursor != null) {while (cursor.moveToFirst()) {this.mApn = cursor.getString(cursor.getColumnIndex("apn"));this.mProxy = cursor.getString(cursor.getColumnIndex("proxy"));this.mPort = cursor.getString(cursor.getColumnIndex("port"));// 代理为空if ((this.mProxy == null) || (this.mProxy.length() <= 0)) {String apn = this.mApn.toUpperCase();// 中国移动WAP设置:APN:CMWAP;代理:10.0.0.172;端口:80// 中国联通WAP设置:APN:UNIWAP;代理:10.0.0.172;端口:80// 中国联通WAP设置(3G):APN:3GWAP;代理:10.0.0.172;端口:80if ((apn.equals("CMWAP")) || (apn.equals("UNIWAP")) || (apn.equals("3GWAP"))) {this.mUseWap = true;this.mProxy = "10.0.0.172";this.mPort = "80";break;}// 中国电信WAP设置:APN(或者接入点名称):CTWAP;代理:10.0.0.200;端口:80if (apn.equals("CTWAP")) {this.mUseWap = true;this.mProxy = "10.0.0.200";this.mPort = "80";break;}}this.mPort = "80";this.mUseWap = true;break;}}this.mUseWap = false;cursor.close();}/*** 检测当前使用的网络类型是WIFI还是WAP* @param context*/private void checkNetworkType(Context context) {NetworkInfo networkInfo = ((ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();if (networkInfo != null) {if (!"wifi".equals(networkInfo.getTypeName().toLowerCase())) {checkApn(context);return;}this.mUseWap = false;}}/*** 判断当前网络连接状态* @param context* @return*/public static boolean isNetworkConnected(Context context) {NetworkInfo networkInfo = ((ConnectivityManager) context.getApplicationContext().getSystemService("connectivity")).getActiveNetworkInfo();if (networkInfo != null) {return networkInfo.isConnectedOrConnecting();}return false;}public String getApn() {return this.mApn;}public String getProxy() {return this.mProxy;}public String getProxyPort() {return this.mPort;}public boolean isWapNetwork() {return this.mUseWap;}
}

ProxyHttpClient类完整定义如下:

package com.hust.iprai;import android.content.Context;
import android.text.TextUtils;
import android.util.Log;import org.apache.http.HttpHost;
import org.apache.http.conn.params.ConnRouteParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;public class ProxyHttpClient extends DefaultHttpClient {private static final int HTTP_TIMEOUT_MS = 30 * 1000;private static final int BUFFER_SIZE = 1024 * 8;private static final String TAG = ProxyHttpClient.class.getSimpleName();private RuntimeException mLeakedException = new IllegalStateException("ProxyHttpClient created and never closed");private String mPort;private String mProxy;private boolean mUseWap;public ProxyHttpClient(Context context) {this(context, null, null);}public ProxyHttpClient(Context context, APNManager manager) {this(context, null, manager);}public ProxyHttpClient(Context context, String userAgent) {this(context, userAgent, null);}public ProxyHttpClient(Context context, String userAgent, APNManager manager) {if (manager == null) {manager = new APNManager(context);}this.mUseWap = manager.isWapNetwork();this.mProxy = manager.getProxy();this.mPort = manager.getProxyPort();if (this.mUseWap) {HttpHost host = new HttpHost(this.mProxy, Integer.valueOf(this.mPort).intValue());getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, host); // 设置代理}HttpConnectionParams.setConnectionTimeout(getParams(), HTTP_TIMEOUT_MS);HttpConnectionParams.setSoTimeout(getParams(), HTTP_TIMEOUT_MS);HttpConnectionParams.setSocketBufferSize(getParams(), BUFFER_SIZE);if (!TextUtils.isEmpty(userAgent)) {HttpProtocolParams.setUserAgent(getParams(), userAgent);}}public void close() {if (this.mLeakedException != null) {getConnectionManager().shutdown();this.mLeakedException = null;}}protected HttpParams createHttpParams() {HttpParams params = super.createHttpParams();HttpProtocolParams.setUseExpectContinue(params, false);return params;}protected void finalize() throws Throwable {super.finalize();if (this.mLeakedException != null) {Log.e(TAG, "Leak found", this.mLeakedException);}}
}

Android代码中实现WAP方式联网相关推荐

  1. php中嵌套html代码和html代码中嵌套php方式

    php中嵌套html代码和html代码中嵌套php方式 一.总结 拷贝的话直接html代码是极好的方式 1.php中嵌套html代码(本质是原生php):a.原生嵌套<?php .....?&g ...

  2. android 设置字体大小和不同颜色,Android代码中设置字体大小,字体颜色,显示两种颜色.倒计时效果...

    Android代码中设置字体大小,字体颜色,显示两种颜色 在xml文件中字体大小用的像素 android:id="@+id/uppaid_time" android:layout_ ...

  3. 从Android代码中来记忆23种设计模式

    原文链接:http://www.jianshu.com/p/1a9f571ad7c0 相信大家都曾经下定决心把23种设计模式牢记于心,每次看完之后过一段时间又忘记了~,又得回去看,脑子里唯一依稀记得的 ...

  4. Android代码中发送Keycode按键

    前言 有时候在代码中需要模拟一些用户操作的按键,例如TV 中遥控器的按键,一些测试脚本的编写.再比如android 手机中虚拟按键,以及悬浮窗中的返回功能,等等.都是模拟发送按键来操作. 这里介绍三种 ...

  5. Android代码中实现 防止手机休眠的处理

    在开发Android程序时,有时候在程序运行的时候,不能让系统休眠,否则有一些运行会停止,因此我们需要设置禁止休眠,有两种方式:一种是添加权限,别一种是代码中设置,建议使用第一种方式,这样,在安装程序 ...

  6. Android代码中setvisibility失效了?

    一.问题现象 最近在开发过程中遇到了在代码中setvisibility失效的问题,在网上查了好多资料都没有解决我的问题 二.发生背景 项目是MVVM架构,使用了databinding,想在tablay ...

  7. android 动态设置margin,android 代码中设置margin

    场景:Android怎么在java代码中设置margin Android如何在java代码中设置margin 原创帖,转发请注明出处:http://thierry-xing.iteye.com/blo ...

  8. android 设置壁纸,Android 代码设置壁纸的方式,兼容各大ROM

    废话不多说,主要代码: public static void intent2SetWallPaper(Context context, String path) { Uri uriPath = get ...

  9. 易安卓打开Android系统中的解锁方式选择页面(锁屏方式选择)

    感谢名单 感谢fylfyl2写的https://blog.csdn.net/fyilun/article/details/21257595 E4A打开锁屏方式页面 Intent intent = ne ...

最新文章

  1. mybatis配置ehcache缓存
  2. C++ void类型指针的使用
  3. 树莓派下安装Django环境
  4. Bootstrap中过渡效果(Transition)模态框插件的使用案例
  5. Java字符串拼接“+”需要注意的问题
  6. 神经网络结构可视化工具总结实践大全
  7. Atitit 知识体系概论 attilax著 三大类型 学术型 应用型 职业技术教育 1 附表1、CIP-2000学科群设置情况总表 1 三大层次 分类 学科 专业 2 20个知识大类 2 需
  8. scratch3文件转exe文件方法
  9. maven之pom文件详解
  10. 摄像头 RTSP 以及远程管理
  11. rails相当于java中的什么_Rails中的ERB中的%,%=,%#和-%有什么区别?
  12. Mac打不开别人的.one文件
  13. 前端基础知识概述 -- 移动端开发的屏幕、图像、字体与布局的兼容适配
  14. Excel 2016 做线性回归分析【高尔顿数据集】与【Anscombe四重奏数据集】
  15. 小鲲Python嘎嘎炫~day2
  16. RHCE 第五次作业
  17. 一小球从100米高度落下,每次落地后反弹原来高度的一半,问第十次落地经过的路径多长?第十次落地后反弹多高?
  18. java面试技巧和注意事项,精心整理
  19. IPv6、雪人计划与中国互联网安全
  20. Mysql学习笔记(一):子查询与选择

热门文章

  1. 个性化智能推荐技术研究总结
  2. Java RESTful Web Service实战(第2版)
  3. 获取一个新的日期,它的值为指定日期当年的最后一天
  4. mysql网络数据库操作模块_15.mysql数据库操作与Paramiko模块
  5. 信号完整性分析6——信号的振铃
  6. DCM+BUFG的使用
  7. 安防工程商前期收集客户信息15种方法与详细流程
  8. 渣土车识别YOLOv5
  9. JQuery中常用的 属性选择器
  10. 关于颜色HSL(色度、饱和度、亮度)