Android WAP NET 區別

參考:http://blog.csdn.net/shichaosong/article/details/8722823

     http://www.jizhuomi.com/android/example/32.html

        http://www.linuxidc.com/Linux/2012-08/67980.htm


1.通過CMNET可以獲得完全的Internet訪問權,可以訪問pop和imap等衆多互聯網服務;

2.通過CMWAP只能訪問網頁,無法訪問pop和imap等衆多互聯網服務。

(1) 爲什麼會有兩個接入點?
  在國際上,通常只有一種GPRS接入方式,爲什麼在中國會有CMWAP和CMNET兩兄弟呢?(彩信之所以單獨配置接入點是因爲彩信服務需要連接專用的服務器,在這裏不作探討。)
  其實,CMWAP 和 CMNET 只是中國移動人爲劃分的兩個GPRS接入方式。前者是爲手機WAP上網而設立的,後者則主要是爲PC、筆記本電腦、PDA等利用GPRS上網服務。它們在實現方式上並沒有任何差別,但因爲定位不同,所以和CMNET相比,CMWAP便有了部分限制,資費上也存在差別。

(2) 什麼是WAP?
  WAP只是一種GPRS應用模式,它與GRPS的接入方式是無關的。WAP應用採用的實現方式是“終端+WAP網關+WAP服務器”的模式,不同於一般Internet的“終端+服務器”的工作模式。主要的目的是通過WAP網關完成WAP-WEB的協議轉換以達到節省網絡流量和兼容現有WEB應用的目的。
  WAP網關從技術的角度講,只是一個提供代理服務的主機,它不一定由網絡運營商提供。但據我所知,中國移動GPRS網絡目前只有唯一的一個WAP網關:10.0.0.172,有中國移動提供,用於WAP瀏覽(HTTP)服務。有一點需要注意,WAP網關和一般意義上的局域網網關是有差別的,標準的WAP網關僅僅實現了HTTP代理的功能,並未完成路由、NAT等局域網網關的功能。這就決定了它在應用上所受到的限制。

爲應用程序增加Http協議代理

  1. try {  
  2.    String proxyHost = android.net.Proxy.getDefaultHost();  
  3.    if (proxyHost != null) {//如果是wap方式,要加網關  
  4.     java.net.Proxy p = new java.net.Proxy(java.net.Proxy.Type.HTTP, new InetSocketAddress(  
  5.       android.net.Proxy.getDefaultHost(), android.net.Proxy.getDefaultPort()));  
  6.     conn = (HttpURLConnection) new URL(url).openConnection(p);  
  7.    } else {  
  8.     conn = (HttpURLConnection) new URL(url).openConnection();  
  9.    }  


(3)無論是移動、聯通還是電信,都至少提供了兩種類型的的APN:WAP方式和NET方式。其中NET方式跟WIFI方式一樣,無需任何設置,可自由訪問所有類型網站,而WAP方式,需要手機先設置代理服務器和端口號等信息,並且只能訪問HTTP協議類型的網站

移動和聯通的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;

由於需要設置Proxy的情況爲使用運營商網絡,所以代碼一開始即使用通過Context獲得ConnectivityManager,執行ConnectivityManager.getActiveNetworkInfo()獲取當前可用的網絡。在有可用網絡的情況下,判斷其類型,如果networkInfo.getType()返回值爲ConnectivityManager.TYPE_MOBILE,則需要設置Proxy;在返回值爲ConnectivityManager.TYPE_WIFI的情況下則跳過設置Proxy的步驟。 

對HttpURLConnection設置Proxy需要指定代理IP及端口號,android.net.Proxy解決了這個問題。執行Proxy.getDefaultHost()和Proxy.getDefaultPort()將返回代理主機的IP及開放端口號,並以這兩個信息傳參構造InetSocketAddress。InetSocketAddress爲IP套接地址,其主要形式可由IP地址與端口號組合而成,亦可用主機域名加端口號組合而成,這種情況下將嘗試將主機域名解析爲IP地址。


移動網絡的判斷:

  1. / 注意二:    
  2.           // 判斷是否電信wap:    
  3.           //不要通過getExtraInfo獲取接入點名稱來判斷類型,    
  4.           // 因爲通過目前電信多種機型測試發現接入點名稱大都爲#777或者null,    
  5.           // 電信機器wap接入點中要比移動聯通wap接入點多設置一個用戶名和密碼,    
  6.           // 所以可以通過這個進行判斷!    
  7.   
  8.           final Cursor c = mContext.getContentResolver().query(    
  9.               PREFERRED_APN_URI, nullnullnullnull);    
  10.           if (c != null) {    
  11.             c.moveToFirst();    
  12.             final String user = c.getString(c    
  13.                 .getColumnIndex("user"));    
  14.             if (!TextUtils.isEmpty(user)) {    
  15.               Log.i("",    
  16.                   "=====================>代理:"    
  17.                       + c.getString(c    
  18.                           .getColumnIndex("proxy")));    
  19.               if (user.startsWith(CTWAP)) {    
  20.                 Log.i("""=====================>電信wap網絡");    
  21.                 return TYPE_CT_WAP;    
  22.               }    
  23.             }    
  24.           }    
  25.           c.close();    
  26.                
  27.                
  28.           // 注意三:    
  29.           // 判斷是移動聯通wap:    
  30.           // 其實還有一種方法通過getString(c.getColumnIndex("proxy")獲取代理ip    
  31.           //來判斷接入點,10.0.0.172就是移動聯通wap,10.0.0.200就是電信wap,但在    
  32.           //實際開發中並不是所有機器都能獲取到接入點代理信息,例如魅族M9 (2.2)等...    
  33.           // 所以採用getExtraInfo獲取接入點名字進行判斷    
  34.                
  35.           String netMode = mobNetInfoActivity.getExtraInfo();    
  36.           Log.i("""netMode ================== " + netMode);    
  37.           if (netMode != null) {    
  38.             // 通過apn名稱判斷是否是聯通和移動wap    
  39.             netMode=netMode.toLowerCase();    
  40.             if (netMode.equals(CMWAP) || netMode.equals(WAP_3G)    
  41.                 || netMode.equals(UNIWAP)) {    
  42.               Log.i("""=====================>移動聯通wap網絡");    
  43.               return TYPE_CM_CU_WAP;    
  44.             }    
  45.   
  46.           }    
  47.   
  48.         } 

===============================================================================

最後總結一點:手機接入點分爲

①WIFI

②Moblie:WAP、NET

在做項目的過程中,如果有網絡訪問,需要判斷網絡類型,如果是WAP,則需要設置代理IP和端口,如果是其他類型則不用設置,具體設置方法也可以參考下面工具類。

=======================================================================================

第一部分:

public class NetUtil {
//當前正在處於連接的APN信息
private static Uri PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn");


/**
* 通過判斷wifi和mobile兩種方式是否能夠連接網絡
*/
public static boolean checkNetWork(Context context) {
boolean isWIFI = isWIFI(context);
boolean isMobile = isMobile(context);


// 如果兩個渠道都無法使用,提示用戶設置網絡信息
if (isWIFI == false && isMobile == false) {
return false;
}

// 判斷APN列表中哪個渠道
if(isMobile)
{
// 讀取當前處於連接狀態的的Apn的配置信息:ip和端口
readAPN(context);//聯繫人信息的讀取基本一致
}



return true;
}

/**
* 讀取當前處於連接狀態的的Apn的配置信息:ip和端口
* @param context
*/


private static void readAPN(Context context) {
ContentResolver contentResolver = context.getContentResolver();
Cursor query = contentResolver.query(PREFERRED_APN_URI, null, null, null, null);
if(query!=null&&query.moveToFirst())
{
//讀取ip和prot
GloableParams.PROXY_IP=query.getString(query.getColumnIndex("proxy"));
GloableParams.PROXY_PORT=query.getInt(query.getColumnIndex("port"));
}

}


/**
* 判斷是否WIFI處於連接狀態

* @return
*/
public static boolean isWIFI(Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (networkInfo != null) {
return networkInfo.isConnected();
}
return false;
}


/**
* 判斷是否APN列表中某個渠道處於連接狀態

* @return
*/
public static boolean isMobile(Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (networkInfo != null) {
return networkInfo.isConnected();
}
return false;
}
}

第二部分:

/**
 * 通用的連接工具(wap)
 * 
 * @author Administrator
 * 
 */
public class HttpClientUtil {
private HttpRequest request;
private HttpGet get;
private HttpPost post;


private HttpResponse response;


private HttpClient client;


public HttpClientUtil() {
client = new DefaultHttpClient();


// 判斷是否讀取到了ip信息(代理)
if (StringUtils.isNotBlank(GloableParams.PROXY_IP)) {
// wap方式上網
HttpHost host = new HttpHost(GloableParams.PROXY_IP, GloableParams.PROXY_PORT);
client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, host);
}
}

}

================================================================================



發佈了59 篇原創文章 · 獲贊 27 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章