[html]
Android應用程序訪問互聯網資源時,在Wifi的情況下處理網絡連接按照上文所講述的方法步驟即可順利實現;但如果當前Android設備的聯網方式是通過移動運營商的網絡服務為中轉,間接訪問的互聯網資源時,則就涉及到在創建HTTP鏈接之前需要設置Proxy,即可盡量避免網絡中斷訪問的情況,順利訪問互聯網。
Proxy中文即代理。已經插入手機卡的Android設備,點擊"設置"→"無線和網絡"→"移動網絡設置"→"接入點名稱",任意點擊一接入點,此時顯示的內容即為當前運營商為使Android設備通過運營商網絡順利接入互聯網而需要設置的代理信息。
通常,中國移動的接入點為CMWAP,代理IP是10.0.0.172,端口為80。
由於不同運營商其代理設置的不同,為保證代碼的一致性及有效性,開發過程中需要封裝出能夠自適應各種不同Proxy環境並且能夠順利訪問互聯網的聯網代碼。
封裝後的方法為openUrl(),代碼如下:
[html]
public static HttpURLConnection openUrl(Context context, String urlStr) {
URL urlURL = null;
HttpURLConnection httpConn = null;
try {
urlURL = new URL(urlStr);
// 需要android.permission.ACCESS_NETWORK_STATE
// 在沒有網絡的情況下,返回值為null。
NetworkInfo networkInfo = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE))
.getActiveNetworkInfo();
// 如果是使用的運營商網絡
if (networkInfo != null) {
if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
// 獲取默認代理主機ip
String host = android.net.Proxy.getDefaultHost();
// 獲取端口
int port = android.net.Proxy.getDefaultPort();
if (host != null && port != -1) {
// 封裝代理連接主機IP與端口號。
InetSocketAddress inetAddress = new InetSocketAddress(host, port);
// 根據URL鏈接獲取代理類型,本鏈接適用於TYPE.HTTP
java.net.Proxy.Type proxyType = java.net.Proxy.Type.valueOf(urlURL.getProtocol().toUpperCase());
java.net.Proxy javaProxy = new java.net.Proxy(proxyType, inetAddress);
httpConn = (HttpURLConnection) urlURL.openConnection(javaProxy);
} else {
httpConn = (HttpURLConnection) urlURL.openConnection();
}
} else {
httpConn = (HttpURLConnection) urlURL.openConnection();
}
httpConn.setConnectTimeout(Const.NETWORK_OPEN_TIMEOUT);
httpConn.setReadTimeout(Const.NETWORK_READ_TIMEOUT);
httpConn.setDoInput(true);
} else {
// LogOut.out(this, "No Avaiable Network");
}
} catch (NullPointerException npe) {
npe.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return httpConn;
}
public static HttpURLConnection openUrl(Context context, String urlStr) {
URL urlURL = null;
HttpURLConnection httpConn = null;
try {
urlURL = new URL(urlStr);
// 需要android.permission.ACCESS_NETWORK_STATE
// 在沒有網絡的情況下,返回值為null。
NetworkInfo networkInfo = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE))
.getActiveNetworkInfo();
// 如果是使用的運營商網絡
if (networkInfo != null) {
if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
// 獲取默認代理主機ip
String host = android.net.Proxy.getDefaultHost();
// 獲取端口
int port = android.net.Proxy.getDefaultPort();
if (host != null && port != -1) {
// 封裝代理連接主機IP與端口號。
InetSocketAddress inetAddress = new InetSocketAddress(host, port);
// 根據URL鏈接獲取代理類型,本鏈接適用於TYPE.HTTP
java.net.Proxy.Type proxyType = java.net.Proxy.Type.valueOf(urlURL.getProtocol().toUpperCase());
java.net.Proxy javaProxy = new java.net.Proxy(proxyType, inetAddress);
httpConn = (HttpURLConnection) urlURL.openConnection(javaProxy);
} else {
httpConn = (HttpURLConnection) urlURL.openConnection();
}
} else {
httpConn = (HttpURLConnection) urlURL.openConnection();
}
httpConn.setConnectTimeout(Const.NETWORK_OPEN_TIMEOUT);
httpConn.setReadTimeout(Const.NETWORK_READ_TIMEOUT);
httpConn.setDoInput(true);
} else {
// LogOut.out(this, "No Avaiable Network");
}
} catch (NullPointerException npe) {
npe.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return httpConn;
}
由於需要設置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地址。
封裝的方法openUrl()兩個參數中第二個參數為網絡鏈接地址,將該地址構造出URL實例後,使用URL.getProtocol()方法即可知該鏈接地址所使用的協議類型。使用得到的鏈接協議類型,執行java.net.Proxy.Type的valueOf()方法進一步得到所需Proxy.Type。
在InetSocketAddress及Proxy.Type確定的情況下,即可構造java.net.Proxy實例,執行代碼為new java.net.Proxy(proxyType, inetAddress)。將新生成的Proxy對象做為參數,執行URL.openConnection(javaProxy),即可得到使用Proxy設置連接互聯網的HttpURLConnection。