Android代码中实现WAP方式联网

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

 

1.  准备知识

国内三大运营商关于WAPNET的信息如下:

1移动的WAP名称是CMWAPNET名称是CMNET

2联通的WAP名称是UNIWAPNET名称是UNINET;联通3GWAP名称是3GWAPNET名称是3GNET

3电信的WAP名称是CTWAPNET名称是CTNET

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

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

由于微软系统限制,暂时无法为您加载这里的Flash内容,点此使用Edge打开

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

2.  代码中实现WAP联网

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

由于微软系统限制,暂时无法为您加载这里的Flash内容,点此使用Edge打开

  1. import android.content.ContentResolver;    
  2. import android.content.Context;    
  3. import android.database.Cursor;    
  4. import android.net.ConnectivityManager;    
  5. import android.net.NetworkInfo;    
  6. import android.net.Uri;    
  7.     
  8. public class APNManager {    
  9.     
  10.     public static final Uri PREFERRED_APN_URI;    
  11.     
  12.     private String mApn; // 接入点名称    
  13.     
  14.     private String mPort; // 端口号    
  15.     
  16.     private String mProxy; // 代理服务器    
  17.     
  18.     private boolean mUseWap; // 是否正在使用WAP    
  19.     
  20.     static {  //取得当前设置的APN  
  21.         PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn");   
  22.     }    
  23.     
  24.     public APNManager(Context context) {    
  25.         checkNetworkType(context);    
  26.     }    
  27.     
  28.     /**  
  29.      * 获得当前设置的APN相关参数  
  30.      * @param context  
  31.      */    
  32.     private void checkApn(Context context) {    
  33.         ContentResolver contentResolver = context.getContentResolver();    
  34.         Uri uri = PREFERRED_APN_URI;    
  35.         String[] apnInfo = new String[3];    
  36.         apnInfo[0] = "apn";    
  37.         apnInfo[1] = "proxy";    
  38.         apnInfo[2] = "port";    
  39.         //使用ContentResolver获得游标对象,之后就是查询操作了  
  40.         //分别查询当前手机所设置的APN、Proxy和Port  
  41.         //如果手机的Proxy没有设置,则需要根据APN来决定当前应该连接的代理服务器地址和端口号  
  42.         Cursor cursor = contentResolver.query(uri, apnInfo, nullnullnull);    
  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. }    
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的值。具体实现如下:

由于微软系统限制,暂时无法为您加载这里的Flash内容,点此使用Edge打开

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值