歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android代碼中實現WAP方式聯網

Android代碼中實現WAP方式聯網

日期:2017/3/1 10:13:07   编辑:Linux編程

無論是移動、聯通還是電信,都至少提供了兩種類型的的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. import android.content.ContentResolver;
  3. import android.content.Context;
  4. import android.database.Cursor;
  5. import android.net.ConnectivityManager;
  6. import android.net.NetworkInfo;
  7. import android.net.Uri;
  8. public class APNManager {
  9. public static final Uri PREFERRED_APN_URI;
  10. private String mApn; // 接入點名稱
  11. private String mPort; // 端口號
  12. private String mProxy; // 代理服務器
  13. private boolean mUseWap; // 是否正在使用WAP
  14. static {
  15. PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn"); // 取得當前設置的APN
  16. }
  17. public APNManager(Context context) {
  18. checkNetworkType(context);
  19. }
  20. /**
  21. * 獲得當前設置的APN相關參數
  22. * @param context
  23. */
  24. private void checkApn(Context context) {
  25. ContentResolver contentResolver = context.getContentResolver();
  26. Uri uri = PREFERRED_APN_URI;
  27. String[] apnInfo = new String[3];
  28. apnInfo[0] = "apn";
  29. apnInfo[1] = "proxy";
  30. apnInfo[2] = "port";
  31. Cursor cursor = contentResolver.query(uri, apnInfo, null, null, null);
  32. if (cursor != null) {
  33. while (cursor.moveToFirst()) {
  34. this.mApn = cursor.getString(cursor.getColumnIndex("apn"));
  35. this.mProxy = cursor.getString(cursor.getColumnIndex("proxy"));
  36. this.mPort = cursor.getString(cursor.getColumnIndex("port"));
  37. // 代理為空
  38. if ((this.mProxy == null) || (this.mProxy.length() <= 0)) {
  39. String apn = this.mApn.toUpperCase();
  40. // 中國移動WAP設置:APN:CMWAP;代理:10.0.0.172;端口:80
  41. // 中國聯通WAP設置:APN:UNIWAP;代理:10.0.0.172;端口:80
  42. // 中國聯通WAP設置(3G):APN:3GWAP;代理:10.0.0.172;端口:80
  43. if ((apn.equals("CMWAP")) || (apn.equals("UNIWAP")) || (apn.equals("3GWAP"))) {
  44. this.mUseWap = true;
  45. this.mProxy = "10.0.0.172";
  46. this.mPort = "80";
  47. break;
  48. }
  49. // 中國電信WAP設置:APN(或者接入點名稱):CTWAP;代理:10.0.0.200;端口:80
  50. if (apn.equals("CTWAP")) {
  51. this.mUseWap = true;
  52. this.mProxy = "10.0.0.200";
  53. this.mPort = "80";
  54. break;
  55. }
  56. }
  57. this.mPort = "80";
  58. this.mUseWap = true;
  59. break;
  60. }
  61. }
  62. this.mUseWap = false;
  63. cursor.close();
  64. }
  65. /**
  66. * 檢測當前使用的網絡類型是WIFI還是WAP
  67. * @param context
  68. */
  69. private void checkNetworkType(Context context) {
  70. NetworkInfo networkInfo = ((ConnectivityManager) context
  71. .getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
  72. if (networkInfo != null) {
  73. if (!"wifi".equals(networkInfo.getTypeName().toLowerCase())) {
  74. checkApn(context);
  75. return;
  76. }
  77. this.mUseWap = false;
  78. }
  79. }
  80. /**
  81. * 判斷當前網絡連接狀態
  82. * @param context
  83. * @return
  84. */
  85. public static boolean isNetworkConnected(Context context) {
  86. NetworkInfo networkInfo = ((ConnectivityManager) context
  87. .getApplicationContext().getSystemService("connectivity"))
  88. .getActiveNetworkInfo();
  89. if (networkInfo != null) {
  90. return networkInfo.isConnectedOrConnecting();
  91. }
  92. return false;
  93. }
  94. public String getApn() {
  95. return this.mApn;
  96. }
  97. public String getProxy() {
  98. return this.mProxy;
  99. }
  100. public String getProxyPort() {
  101. return this.mPort;
  102. }
  103. public boolean isWapNetwork() {
  104. return this.mUseWap;
  105. }
  106. }
ProxyHttpClient類完整定義如下:
  1. package com.hust.iprai;
  2. import android.content.Context;
  3. import android.text.TextUtils;
  4. import android.util.Log;
  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. public class ProxyHttpClient extends DefaultHttpClient {
  12. private static final int HTTP_TIMEOUT_MS = 30 * 1000;
  13. private static final int BUFFER_SIZE = 1024 * 8;
  14. private static final String TAG = ProxyHttpClient.class.getSimpleName();
  15. private RuntimeException mLeakedException = new IllegalStateException("ProxyHttpClient created and never closed");
  16. private String mPort;
  17. private String mProxy;
  18. private boolean mUseWap;
  19. public ProxyHttpClient(Context context) {
  20. this(context, null, null);
  21. }
  22. public ProxyHttpClient(Context context, APNManager manager) {
  23. this(context, null, manager);
  24. }
  25. public ProxyHttpClient(Context context, String userAgent) {
  26. this(context, userAgent, null);
  27. }
  28. public ProxyHttpClient(Context context, String userAgent, APNManager manager) {
  29. if (manager == null) {
  30. manager = new APNManager(context);
  31. }
  32. this.mUseWap = manager.isWapNetwork();
  33. this.mProxy = manager.getProxy();
  34. this.mPort = manager.getProxyPort();
  35. if (this.mUseWap) {
  36. HttpHost host = new HttpHost(this.mProxy, Integer.valueOf(this.mPort).intValue());
  37. getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, host); // 設置代理
  38. }
  39. HttpConnectionParams.setConnectionTimeout(getParams(), HTTP_TIMEOUT_MS);
  40. HttpConnectionParams.setSoTimeout(getParams(), HTTP_TIMEOUT_MS);
  41. HttpConnectionParams.setSocketBufferSize(getParams(), BUFFER_SIZE);
  42. if (!TextUtils.isEmpty(userAgent)) {
  43. HttpProtocolParams.setUserAgent(getParams(), userAgent);
  44. }
  45. }
  46. public void close() {
  47. if (this.mLeakedException != null) {
  48. getConnectionManager().shutdown();
  49. this.mLeakedException = null;
  50. }
  51. }
  52. protected HttpParams createHttpParams() {
  53. HttpParams params = super.createHttpParams();
  54. HttpProtocolParams.setUseExpectContinue(params, false);
  55. return params;
  56. }
  57. protected void finalize() throws Throwable {
  58. super.finalize();
  59. if (this.mLeakedException != null) {
  60. Log.e(TAG, "Leak found", this.mLeakedException);
  61. }
  62. }
  63. }
Copyright © Linux教程網 All Rights Reserved