Android代码中实现WAP方式联网

原文:http://blog.csdn.net/ace1985/article/details/7844159

无论是移动、联通还是电信,都至少提供了两种类型的的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类完整定义如下:

  1. package com.hust.iprai;  
  2.   
  3. import android.content.ContentResolver;  
  4. import android.content.Context;  
  5. import android.database.Cursor;  
  6. import android.net.ConnectivityManager;  
  7. import android.net.NetworkInfo;  
  8. import android.net.Uri;  
  9.   
  10. public class APNManager {  
  11.   
  12.     public static final Uri PREFERRED_APN_URI;  
  13.   
  14.     private String mApn; // 接入点名称  
  15.   
  16.     private String mPort; // 端口号  
  17.   
  18.     private String mProxy; // 代理服务器  
  19.   
  20.     private boolean mUseWap; // 是否正在使用WAP  
  21.   
  22.     static {  
  23.         PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn"); // 取得当前设置的APN  
  24.     }  
  25.   
  26.     public APNManager(Context context) {  
  27.         checkNetworkType(context);  
  28.     }  
  29.   
  30.     /** 
  31.      * 获得当前设置的APN相关参数 
  32.      * @param context 
  33.      */  
  34.     private void checkApn(Context context) {  
  35.         ContentResolver contentResolver = context.getContentResolver();  
  36.         Uri uri = PREFERRED_APN_URI;  
  37.         String[] apnInfo = new String[3];  
  38.         apnInfo[0] = "apn";  
  39.         apnInfo[1] = "proxy";  
  40.         apnInfo[2] = "port";  
  41.   
  42.         Cursor cursor = contentResolver.query(uri, apnInfo, null, null, null);  
  43.         if (cursor != null) {  
  44.             while (cursor.moveToFirst()) {  
  45.                 this.mApn = cursor.getString(cursor.getColumnIndex("apn"));  
  46.                 this.mProxy = cursor.getString(cursor.getColumnIndex("proxy"));  
  47.                 this.mPort = cursor.getString(cursor.getColumnIndex("port"));  
  48.   
  49.                 // 代理为空  
  50.                 if ((this.mProxy == null) || (this.mProxy.length() <= 0)) {  
  51.                     String apn = this.mApn.toUpperCase();  
  52.                       
  53.                     // 中国移动WAP设置:APN:CMWAP;代理:10.0.0.172;端口:80  
  54.                     // 中国联通WAP设置:APN:UNIWAP;代理:10.0.0.172;端口:80  
  55.                     // 中国联通WAP设置(3G):APN:3GWAP;代理:10.0.0.172;端口:80  
  56.                     if ((apn.equals("CMWAP")) || (apn.equals("UNIWAP")) || (apn.equals("3GWAP"))) {  
  57.                         this.mUseWap = true;  
  58.                         this.mProxy = "10.0.0.172";  
  59.                         this.mPort = "80";  
  60.                         break;  
  61.                     }  
  62.                       
  63.                     // 中国电信WAP设置:APN(或者接入点名称):CTWAP;代理:10.0.0.200;端口:80  
  64.                     if (apn.equals("CTWAP")) {  
  65.                         this.mUseWap = true;  
  66.                         this.mProxy = "10.0.0.200";  
  67.                         this.mPort = "80";  
  68.                         break;  
  69.                     }  
  70.                       
  71.                 }  
  72.                 this.mPort = "80";  
  73.                 this.mUseWap = true;  
  74.                 break;  
  75.             }  
  76.   
  77.         }  
  78.   
  79.         this.mUseWap = false;  
  80.         cursor.close();  
  81.     }  
  82.   
  83.     /** 
  84.      * 检测当前使用的网络类型是WIFI还是WAP 
  85.      * @param context 
  86.      */  
  87.     private void checkNetworkType(Context context) {  
  88.         NetworkInfo networkInfo = ((ConnectivityManager) context  
  89.                 .getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();  
  90.         if (networkInfo != null) {  
  91.             if (!"wifi".equals(networkInfo.getTypeName().toLowerCase())) {  
  92.                 checkApn(context);  
  93.                 return;  
  94.             }  
  95.             this.mUseWap = false;  
  96.         }  
  97.     }  
  98.   
  99.     /** 
  100.      * 判断当前网络连接状态 
  101.      * @param context 
  102.      * @return 
  103.      */  
  104.     public static boolean isNetworkConnected(Context context) {  
  105.         NetworkInfo networkInfo = ((ConnectivityManager) context  
  106.                 .getApplicationContext().getSystemService("connectivity"))  
  107.                 .getActiveNetworkInfo();  
  108.         if (networkInfo != null) {  
  109.             return networkInfo.isConnectedOrConnecting();  
  110.         }  
  111.         return false;  
  112.     }  
  113.   
  114.     public String getApn() {  
  115.         return this.mApn;  
  116.     }  
  117.   
  118.     public String getProxy() {  
  119.         return this.mProxy;  
  120.     }  
  121.   
  122.     public String getProxyPort() {  
  123.         return this.mPort;  
  124.     }  
  125.   
  126.     public boolean isWapNetwork() {  
  127.         return this.mUseWap;  
  128.     }  
  129. }  

ProxyHttpClient类完整定义如下:

  1. package com.hust.iprai;  
  2.   
  3. import android.content.Context;  
  4. import android.text.TextUtils;  
  5. import android.util.Log;  
  6.   
  7. import org.apache.http.HttpHost;  
  8. import org.apache.http.conn.params.ConnRouteParams;  
  9. import org.apache.http.impl.client.DefaultHttpClient;  
  10. import org.apache.http.params.HttpConnectionParams;  
  11. import org.apache.http.params.HttpParams;  
  12. import org.apache.http.params.HttpProtocolParams;  
  13.   
  14. public class ProxyHttpClient extends DefaultHttpClient {  
  15.       
  16.     private static final int HTTP_TIMEOUT_MS = 30 * 1000;  
  17.       
  18.     private static final int BUFFER_SIZE = 1024 * 8;  
  19.   
  20.     private static final String TAG = ProxyHttpClient.class.getSimpleName();  
  21.   
  22.     private RuntimeException mLeakedException = new IllegalStateException("ProxyHttpClient created and never closed");  
  23.   
  24.     private String mPort;  
  25.   
  26.     private String mProxy;  
  27.   
  28.     private boolean mUseWap;  
  29.   
  30.     public ProxyHttpClient(Context context) {  
  31.         this(context, null, null);  
  32.     }  
  33.   
  34.     public ProxyHttpClient(Context context, APNManager manager) {  
  35.         this(context, null, manager);  
  36.     }  
  37.   
  38.     public ProxyHttpClient(Context context, String userAgent) {  
  39.         this(context, userAgent, null);  
  40.     }  
  41.   
  42.     public ProxyHttpClient(Context context, String userAgent, APNManager manager) {  
  43.         if (manager == null) {  
  44.             manager = new APNManager(context);  
  45.         }  
  46.           
  47.         this.mUseWap = manager.isWapNetwork();  
  48.         this.mProxy = manager.getProxy();  
  49.         this.mPort = manager.getProxyPort();  
  50.         if (this.mUseWap) {  
  51.             HttpHost host = new HttpHost(this.mProxy, Integer.valueOf(this.mPort).intValue());  
  52.             getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, host); // 设置代理  
  53.         }  
  54.         HttpConnectionParams.setConnectionTimeout(getParams(), HTTP_TIMEOUT_MS);  
  55.         HttpConnectionParams.setSoTimeout(getParams(), HTTP_TIMEOUT_MS);  
  56.         HttpConnectionParams.setSocketBufferSize(getParams(), BUFFER_SIZE);  
  57.         if (!TextUtils.isEmpty(userAgent)) {  
  58.             HttpProtocolParams.setUserAgent(getParams(), userAgent);  
  59.         }  
  60.     }  
  61.   
  62.     public void close() {  
  63.         if (this.mLeakedException != null) {  
  64.             getConnectionManager().shutdown();  
  65.             this.mLeakedException = null;  
  66.         }  
  67.     }  
  68.   
  69.     protected HttpParams createHttpParams() {  
  70.         HttpParams params = super.createHttpParams();  
  71.         HttpProtocolParams.setUseExpectContinue(params, false);  
  72.         return params;  
  73.     }  
  74.   
  75.     protected void finalize() throws Throwable {  
  76.         super.finalize();  
  77.         if (this.mLeakedException != null) {  
  78.             Log.e(TAG, "Leak found", this.mLeakedException);  
  79.         }  
  80.     }  
  81. }  
时间: 2025-01-31 02:02:42

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

android代码布局-android 代码中设置控件的垂直居中和两个控件之间的距离。

问题描述 android 代码中设置控件的垂直居中和两个控件之间的距离. 因为数据是动态的 所以所有的控件和布局都是在java代码里面设置 怎样才能让一个控件垂直居中 还有两个控件之间的距离又是怎么设置的啊 求高手指点啊 最好能给点代码 我是新手 说的太笼统了 看不太懂 谢谢了 解决方案 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT,

android 代码中怎么判断一个TextView有多少行?

问题描述 android 代码中怎么判断一个TextView有多少行? android 代码中怎么判断一个TextView有多少行? 解决方案 android.text.Layout包含此信息和更多final int lineCount = textView.getLayout().getLineCount(); 解决方案二: android.text.Layout包含此信息和更多final int lineCount = textView.getLayout().getLineCount();

android 代码中禁用sim卡

问题描述 android 代码中禁用sim卡 android 代码中禁用sim卡,但又不屏蔽数据网络,要怎么实现? 解决方案 禁用sim卡,如何和基站通讯连接到网络呢?好比不许你带钥匙,又要允许你进入房间,这不是矛盾么?

Android代码中多个surfaceview之间的切换以及传递数据

问题描述 Android代码中多个surfaceview之间的切换以及传递数据 开发2D游戏时:在游戏进行中时,按下返回键,出现一个菜单,有三个按钮replay.resume.Mainmenu.这个菜单用另一个surfaceview完成,怎样切换,以及传递数据

process-如何在Android代码中使用 adb shell命令

问题描述 如何在Android代码中使用 adb shell命令 想使用 "mount -o remount,rw /system"这个命令 使用过 Process process = null; DataOutputStream os = null; process = Runtime.getRuntime().exec("su"); os = new DataOutputStream(process.getOutputStream()); os.writeByt

broadcast-有关在android代码中调用adb命令发送通知,没有回调onReceive方法问题

问题描述 有关在android代码中调用adb命令发送通知,没有回调onReceive方法问题 大神们,非常谦虚的请教下问题,是这样,我在终端输入adb shell am broadcast -a testBroadcastReceiver --es packageName "you packageName",可以回调onReceive方法,但是当我把该命令写在代码中,同样执行同样的命令,只是用代码实现,就不会调用onReceive,请帮忙解决下~ 解决方案 http://blog.c

Android应用中使用DOM方式解析XML格式数据的基本方法_Android

DOM比SAX更容易掌握,因为她没有涉及回调和复杂的状态管理,然而,DOM的实现常常将所有的XML节点保存在内存中,这样使的处理较大的文档效率低. XML基本的节点类型 node - DOM基本的数据类型 Element - 最主要处理的对象是Element Attr - 元素的属性 Text - 一个Element 或者Attr的实际内容 Document - 代表整个XML文档,一个Document对象通常也称为一颗DOM树   1.在src目录下新建一个android.xml <?xml

Android应用中使用DOM方式解析XML格式数据的基本方法

DOM比SAX更容易掌握,因为她没有涉及回调和复杂的状态管理,然而,DOM的实现常常将所有的XML节点保存在内存中,这样使的处理较大的文档效率低. XML基本的节点类型 node - DOM基本的数据类型 Element - 最主要处理的对象是Element Attr - 元素的属性 Text - 一个Element 或者Attr的实际内容 Document - 代表整个XML文档,一个Document对象通常也称为一颗DOM树   1.在src目录下新建一个android.xml <?xml

在android模拟器中解析不到tomcat中的xml文件,

问题描述 在android模拟器中解析不到tomcat中的xml文件, 在android模拟器中解析不到tomcat中的xml文件,但是在浏览器中使用相同的地址,却可以访问 package xtm.mp3player; import xtm.download.HttpDownloader; import android.app.ListActivity; import android.os.Bundle; import android.util.Log; import android.view.