0.  前言

无论是移动、联通还是电信,都至少提供了两种类型的的APN,WAP方式和NET方式。

其中NET方式跟WIFI方式一样,无需任何设置,可自由访问所有类型网站,而WAP方式需要手机先设置代理服务器和端口号等信息,并且只能访问HTTP协议类型的网站。本篇将介绍如何在代码中实现WAP方式联网。

1.  准备知识

国内三大运营商关于WAP和NET的信息如下:

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

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

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

其中三家运营商WAP端口均为80,移动和联通的WAP代理服务器都是10.0.0.172,电信的WAP代理服务器是10.0.0.200。

在Android系统中,对于获取手机的APN设置,需要通过ContentProvider来进行数据库查询,查询的URI地址如下。

//取得全部的APN列表:content://telephony/carriers;
//取得当前设置的APN:content://telephony/carriers/preferapn;
//取得current=1的APN:content://telephony/carriers/current;

2.  代码中实现WAP联网

下面我们的代码就是使用APNManager类获取当前首选的APN设置,并继承HttpClient实现我们自己的代理ProxyHttpClient类。

首先来看下APNManager类的实现,这个类的主要功能是获得APN的代理服务器和端口号。

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; // 是否正在使用WAP static { //取得当前设置的APN
PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn");
} 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";
//使用ContentResolver获得游标对象,之后就是查询操作了
//分别查询当前手机所设置的APN、Proxy和Port
//如果手机的Proxy没有设置,则需要根据APN来决定当前应该连接的代理服务器地址和端口号
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;端口:80
if ((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;端口:80
if (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;
}
}

通过APNManager类获取到或者设置好当前手机的WAP设置的代理和端口之后,就可以构造我们自己的代理类了,这个类定义为ProxyHttpClient,在该类的构造函数中,首先获得APNManager的实例,然后获取到APNManager类中的信息,即获取代理服务器proxy和端口值port,通过这两个参数构造HttpHost实例,并将host实例设置为ConnRouteParams.DEFAULT_PROXY的值。具体实现如下:

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. Android代码中实现WAP方式联网

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

  2. Android开发代码规范(转)

    Android开发代码规范 1.命名基本原则    在面向对象编程中,对于类,对象,方法,变量等方面的命名是非常有技巧的.比如,大小写的区分,使用不同字母开头等等.但究其本,追其源,在为一个资源其名称 ...

  3. 黑客破译android开发代码真就那么简单?

    很多程序员辛辛苦苦开发出的android开发代码,很容易就被黑客翻译了. Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了 ...

  4. android 开发代码被黑客破译有那么容易吗?

    很多程序员辛辛苦苦开发出的android开发代码,很容易就被黑客翻译了. Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了 ...

  5. Android开发 --代码布局

    Android开发 --代码布局 在线性布局LinearLayout里加入view比较简单,因为属性比较少,布局简单 示例,加入一个TextView LinearLayout layout = (Li ...

  6. xamarin android 在代码中如何设置文本颜色

    xamarin android 在代码中如何设置文本颜色 TextView v = FindViewById<TextView>(Android.Resource.Id.Message); ...

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

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

  8. Android开发代码规范总结

    本篇开始总结Android开发中的一些注意事项,提高代码质量(仅供参考): 1.  Activity间的数据通信,对于数据量比较大的,避免使用 Intent + Parcelable 的方式,可以考虑 ...

  9. Android开发代码规范

    目录 1.命名基本原则  2.命名基本规范 2.1编程基本命名规范 2.2分类命名规范 3.分类命名规范 3.1基本数据类型命名规范 3.2控件命名规范 3.3变量命名规范 3.4整个项目的目录规范化 ...

随机推荐

  1. Angular-学习。

     今天刚学了点关于Angular的知识,就迫不及待的想跟大家来分享. 1.angular.extend ( )方法可以把一个或多个对象中的方法和属性扩展到一个目的对象中. <script typ ...

  2. Win10自动重启原因怎么查Windows10无故自动重启

    电脑偶尔自动重启,可能很少用户会在意,若电脑经常无故重启,那么应该怎么办,怎么查找电脑无故自动重启原因呢?下面就以Windows10系统自动重启为例,来查查WIN10无故重启是什么原因导致.百度经验: ...

  3. Falsk的模板分配和蓝图、定制错误信息、 和补充

    Flask的模板渲染: Flask的模板在进行渲染的时候是默认选则templates下的html文件 我们可以在实例化app的时候,指定文件来进行选择: 模板渲染更改文件夹:template_fold ...

  4. 将亚马逊aws的ec2服务器的登陆方式改为密码登陆

    1.在用密钥登陆ec2后,为root用户创建密码: sudo passwd root 系统会让你输入两次密码 2.切换为root用户,并且编辑sshd_config文件,PasswordAuthent ...

  5. windows安装及配置mysql5.7

    引子 mysql官方网站上没有 windows mysql5.7 64位版本msi的安装包下载,我们可以通过zip版本解压缩后手动安装配置环境. msi安装的话有32位的,基本上就是看着图形界面来一步 ...

  6. CSS学习摘要-定位

    CSS学习摘要-定位 注:全文摘自MDN-CSS定位 定位允许您从正常的文档流布局中取出元素,并使它们具有不同的行为,例如放在另一个元素的上面,或者始终保持在浏览器视窗内的同一位置. 本文解释的是定位 ...

  7. matlab操作(整理)

    http://blog.csdn.net/ysuncn/article/details/1741828 http://zhan.renren.com/h5/entry/3602888498000464 ...

  8. ZT 二叉树先序,中序,后序遍历非递归实现

    二叉树先序,中序,后序遍历非递归实现 分类: 数据结构及算法2012-04-28 14:30 8572人阅读 评论(6) 收藏 举报 structc 利用栈实现二叉树的先序,中序,后序遍历的非递归操作 ...

  9. n=n+1 放在print(s)的前/后的影响

    # 1+2+3+4+5+6+.....+100 = ? #关键在于,当n为时,才print(s) n = 1s = 0while n < 101: s = s + n if n ==100: # ...

  10. 面向对象程序设计_Task4_Calculator1.1

    The 2nd part of the Calculator program 题目链接:Click Here github链接:Click Here 诶嘿,第二部分,要开始实现计算的功能了,估计离不是 ...