1.經過CMNET能夠得到徹底的Internet訪問權,能夠訪問pop和imap等衆多互聯網服務; html
2.經過CMWAP只能訪問網頁,沒法訪問pop和imap等衆多互聯網服務。 java
(1) 爲何會有兩個接入點?
在國際上,一般只有一種GPRS接入方式,爲何在中國會有CMWAP和CMNET兩兄弟呢?(彩信之因此單獨配置接入點是由於彩信服務須要鏈接專用的服務器,在這裏不做探討。)
其實,CMWAP 和 CMNET 只是中國移動人爲劃分的兩個GPRS接入方式。前者是爲手機WAP上網而設立的,後者則主要是爲PC、筆記本電腦、PDA等利用GPRS上網服務。它們在實現方式上並無任何差異,但由於定位不一樣,因此和CMNET相比,CMWAP便有了部分限制,資費上也存在差異。 linux
(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等局域網網關的功能。這就決定了它在應用上所受到的限制。 android
爲應用程序增長Http協議代理 數據庫
- try {
- String proxyHost = android.net.Proxy.getDefaultHost();
- if (proxyHost != null) {//若是是wap方式,要加網關
- java.net.Proxy p = new java.net.Proxy(java.net.Proxy.Type.HTTP, new InetSocketAddress(
- android.net.Proxy.getDefaultHost(), android.net.Proxy.getDefaultPort()));
- conn = (HttpURLConnection) new URL(url).openConnection(p);
- } else {
- conn = (HttpURLConnection) new URL(url).openConnection();
- }
(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地址是: ide
取得所有的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地址。
移動網絡的判斷:
- / 注意二:
- // 判斷是否電信wap:
- //不要經過getExtraInfo獲取接入點名稱來判斷類型,
- // 由於經過目前電信多種機型測試發現接入點名稱大都爲#777或者null,
- // 電信機器wap接入點中要比移動聯通wap接入點多設置一個用戶名和密碼,
- // 因此能夠經過這個進行判斷!
-
- final Cursor c = mContext.getContentResolver().query(
- PREFERRED_APN_URI, null, null, null, null);
- if (c != null) {
- c.moveToFirst();
- final String user = c.getString(c
- .getColumnIndex("user"));
- if (!TextUtils.isEmpty(user)) {
- Log.i("",
- "=====================>代理:"
- + c.getString(c
- .getColumnIndex("proxy")));
- if (user.startsWith(CTWAP)) {
- Log.i("", "=====================>電信wap網絡");
- return TYPE_CT_WAP;
- }
- }
- }
- c.close();
-
-
- // 注意三:
- // 判斷是移動聯通wap:
- // 其實還有一種方法經過getString(c.getColumnIndex("proxy")獲取代理ip
- //來判斷接入點,10.0.0.172就是移動聯通wap,10.0.0.200就是電信wap,但在
- //實際開發中並非全部機器都能獲取到接入點代理信息,例如魅族M9 (2.2)等...
- // 因此採用getExtraInfo獲取接入點名字進行判斷
-
- String netMode = mobNetInfoActivity.getExtraInfo();
- Log.i("", "netMode ================== " + netMode);
- if (netMode != null) {
- // 經過apn名稱判斷是不是聯通和移動wap
- netMode=netMode.toLowerCase();
- if (netMode.equals(CMWAP) || netMode.equals(WAP_3G)
- || netMode.equals(UNIWAP)) {
- Log.i("", "=====================>移動聯通wap網絡");
- return TYPE_CM_CU_WAP;
- }
-
- }
-
- }
如何判斷2G網絡和3G網絡:待續。。。
參考: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