无论是移动、联通还是电信,都至少提供了两种类型的的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; // 是否正在使用WAP static {
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;端口: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;
}
}

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);
}
}
} 转自:http://www.cnblogs.com/-OYK/archive/2012/03/17/2403241.html
------------------------------------------------------------------
http://www.cnblogs.com/-OYK/archive/2012/03/17/2403241.html

Android代码中实现WAP方式联网的更多相关文章

  1. Android开发——代码中实现WAP方式联网

    ,移动和联通的WAP代理服务器都是10.0.0.172,电信的WAP代理服务器是10.0.0.200. 在Android系统中,对于获取手机的APN设置,需要通过ContentProvider来进行数 ...

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

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

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

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

  4. Android 代码中文字在手机上显示乱码问题解决方法

    在学习Android过程中,用于测试时发现,代码中的中文在真机上会显示乱码, 网上查阅了些资料,参考如下: http://www.androidchina.net/3024.html http://b ...

  5. android代码中自定义布局

    转载地址:http://blog.csdn.net/luckyjda/article/details/8760214RelativeLayout rl = new RelativeLayout(thi ...

  6. android 代码中使用textAppearance

    一开始在代码中我以为使用tvAge.setTextAppearance(context, resid);这样的的方式就能行, 运行之后发现这个设置并未生效,于是到处搜索在代码中设置系统样式的的解决方法 ...

  7. Android代码中动态设置图片的大小(自动缩放),位置

    项目中需要用到在代码中动态调整图片的位置和设置图片大小,能自动缩放图片,用ImageView控件,具体做法如下: 1.布局文件 <RelativeLayout xmlns:android=&qu ...

  8. Android用PhoneGap封装webapp在android代码中实现连按退出和loadingpage

    用PhoneGap封装后的程序有一些瑕疵,比如启动时黑屏,菜单按钮和返回按钮不好控制等. PhoneGap也在github提交的它的源码(版本:2.8): https://github.com/apa ...

  9. Android代码中使用Ping命令

    项目中需要搜索同一WIFI局域网中的设备并进行通信,暂时想到的办法是得到局域网网段的地址,因为同一局域网中的IP地址前三位是相同的,而第四位的范围从0~250,所以对第四位进行遍历搜索,能ping通的 ...

随机推荐

  1. java 支付宝即时到帐提交订单dome

    package com.tian.batis; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; imp ...

  2. 数据库表转换成JavaBean

    本人花了几个小时用C#开发了一款,数据表生成javabean的软件.目前只支持Mysql,内置类型映射器.开源,没有测试. 支持数据库注释,忘了获取表注释,见谅.使用之前配置一下config.xml文 ...

  3. 制作百度地图离线JavaScript API加载本地瓦片地图

    全面介绍,请看下列介绍地址,改写目前最新版本的百度V2.0地图,已全面实现离线操作,能到达在线功能的95%以上 http://api.jjszd.com:8081/apituiguang/gistg. ...

  4. 5种banner

      <!DOCTYPE html><html> <head>  <meta charset="UTF-8">  <tit ...

  5. StringUtils常用方法介绍

    要使用StringUtils类,首先需要导入:import org.apache.commons.lang.StringUtils;这个包 在maven项目中需要添加下面这个依赖: <depen ...

  6. 强制所有网页链接在同一页面打开或者在TabControl中弹出新窗口

    IEwebbrowser中老生常谈的话题. 一般的解决都是通过 // webBrowser.Navigating += WebBrowser_Navigating; 注册转跳前事件 private v ...

  7. kali 插耳机没声音

    打开终端,然后输入命令:下载pulseaudio音量控制软件: apt install pavucontrol 然后终端输入指令:pavucontrol打开软件,发现在输出设备中有两个输出设备:一个N ...

  8. FJWC2019 子图 (三元环计数、四元环计数)

    给定 n 个点和 m 条边的一张图和一个值 k ,求图中边数为 k 的联通子图个数 mod 1e9+7. \(n \le 10^5, m \le 2 \times 10^5, 1 \le k \le ...

  9. 初用sqlite3.exe

    1.记得要先建立数据库文件 为了进行数据库的编写,我安装了sqlite3,由于刚接触数据库,我尝试着建立表,并插入元组,属性,用select from语句也可以调出写入的内容,但是不知道如何保存,直接 ...

  10. NAND NOR Flash 和MTD

    来自:http://blog.sina.com.cn/s/blog_6b489d5e0102xm62.html 一.NAND和NOR Flash 一般来说,快闪记忆体可分为两大规格,一个是NAND, ...