[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。