參考: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協議代理
- 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地址是:
取得全部的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;
- }
- }
- }
===============================================================================
最後總結一點:手機接入點分爲
①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);
}
}
}
================================================================================