Android代码中实现WAP方式联网
无论是移动、联通还是电信,都至少提供了两种类型的的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方式联网的更多相关文章
- Android开发——代码中实现WAP方式联网
,移动和联通的WAP代理服务器都是10.0.0.172,电信的WAP代理服务器是10.0.0.200. 在Android系统中,对于获取手机的APN设置,需要通过ContentProvider来进行数 ...
- Android代码中设置字体大小,字体颜色,显示两种颜色.倒计时效果
Android代码中设置字体大小,字体颜色,显示两种颜色 在xml文件中字体大小用的像素 <TextView android:id="@+id/uppaid_time" an ...
- php中嵌套html代码和html代码中嵌套php方式
php中嵌套html代码和html代码中嵌套php方式 一.总结 拷贝的话直接html代码是极好的方式 1.php中嵌套html代码(本质是原生php):a.原生嵌套<?php .....?&g ...
- Android 代码中文字在手机上显示乱码问题解决方法
在学习Android过程中,用于测试时发现,代码中的中文在真机上会显示乱码, 网上查阅了些资料,参考如下: http://www.androidchina.net/3024.html http://b ...
- android代码中自定义布局
转载地址:http://blog.csdn.net/luckyjda/article/details/8760214RelativeLayout rl = new RelativeLayout(thi ...
- android 代码中使用textAppearance
一开始在代码中我以为使用tvAge.setTextAppearance(context, resid);这样的的方式就能行, 运行之后发现这个设置并未生效,于是到处搜索在代码中设置系统样式的的解决方法 ...
- Android代码中动态设置图片的大小(自动缩放),位置
项目中需要用到在代码中动态调整图片的位置和设置图片大小,能自动缩放图片,用ImageView控件,具体做法如下: 1.布局文件 <RelativeLayout xmlns:android=&qu ...
- Android用PhoneGap封装webapp在android代码中实现连按退出和loadingpage
用PhoneGap封装后的程序有一些瑕疵,比如启动时黑屏,菜单按钮和返回按钮不好控制等. PhoneGap也在github提交的它的源码(版本:2.8): https://github.com/apa ...
- Android代码中使用Ping命令
项目中需要搜索同一WIFI局域网中的设备并进行通信,暂时想到的办法是得到局域网网段的地址,因为同一局域网中的IP地址前三位是相同的,而第四位的范围从0~250,所以对第四位进行遍历搜索,能ping通的 ...
随机推荐
- .Net Mvc 四种过滤器
一.授权过滤器:AuthorizationFilters 二.动作过滤:ActionFilters 三.响应过滤:ResultFilters 四.异常过滤:ExceptionFilters ===== ...
- .Net Core 项目区域请求设置
.net core 和asp.net MVC区域请求有个区别,这里重点记录一下 asp.net MVC 区域请求直接是/区域名称/控制名称/方法名称,其他不需要设置任何东西,而Core 项目这样请求路 ...
- C# WinForm Webbrowser 强制所有网页链接在同一页面打开或者在TabControl中弹出新窗口(续)
上面那个文写的如同粑粑一样 效果图 Winfrom 中添加这个类就好了 using System; using System.Collections.Generic; using System.Com ...
- Delphi XE8中Android开发有用的资源!
一,FireMonkey Component Library在XE8帮助(topics.chm)中的位置:FireMonkey Component Library,展示了FireMonkey控件在VC ...
- 强制json格式
- 190308python-MySQL
一.Python连接MySQL import pymysql conn = pymysql.connect(host='192.168.100.4', port=3306, user='dongfei ...
- ssh 操作
1.登录 ssh 用户名@远程地址 2.拷贝:scp -r 本地文件夹 远程文件夹(user@ip:目录) 3.从ssh中临时退出: a. ~ (control+z) b.查看后台任务:jobs c ...
- 关于执行webdriver.Chrome; 报错WebDriverException: Message: unknown error: Element is not clickable at point (1085, 103)
from selenium import webdriverfrom time import sleep dr = webdriver.Chrome() dr.get("http://pj1 ...
- state-表单
/*** 需求: 定义一个组件,可以将用户在输入框内输入的内容 进行实时显示** 分析:组件与用户交互过程中,存在状态的变化,即输入框的值** */var Input = React.createCl ...
- 分布式中为什么要加入redis缓存的理解
面我们介绍了mybatis自带的二级缓存,但是这个缓存是单服务器工作,无法实现分布式缓存.那么什么是分布式缓存呢?假设现在有两个服务器1和2,用户访问的时候访问了1服务器,查询后的缓存就会放在1服务器 ...