[英]check if device is really connected to the internet android
我正在開發一個android應用程序,我需要使用以下方法檢查設備是否真的連接到了互聯網
cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm.getActiveNetworkInfo() != null
&& cm.getActiveNetworkInfo().isAvailable()
&& cm.getActiveNetworkInfo().isConnected()) {
try {
URL url = new URL("http://www.google.com");
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(10 * 1000); // Ten seconds timeout in milliseconds
urlc.connect();
if (urlc.getResponseCode() == 200) { // success
System.out.println("success mobile");
return true;
} else { // Fail
return false;
}
} catch (IOException e) {
return false;
}
}
else
{
return false;
}
如果我禁用移動數據或wifi,則此方法有效。 但是,在我的情況下,供應商只是停止了互聯網,因為我已達到使用限制或數據余量不足。 因此,在這種情況下,即使當我進入瀏覽器並在google.com中鍵入該方法時,該方法仍會返回TRUE,但該方法無法正常工作,並且提供商收到我已達到極限的消息? 因此,即使由於使用限制而無法從設備打開google.com ping還是可以訪問? 我只能訪問我的移動服務提供商的網頁,在這里我可以購買更多的零用錢,因此互聯網不會被關閉,而只能是有限的。 我該如何檢查?
最好的方法是實現超時異常。
HttpGet httpGet = new HttpGet(url); HttpParams httpParameters = new BasicHttpParams(); // Set the timeout in milliseconds until a connection is established. // The default value is zero, that means the timeout is not used. int timeoutConnection = 3000; HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); // Set the default socket timeout (SO_TIMEOUT) // in milliseconds which is the timeout for waiting for data. int timeoutSocket = 5000; HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters); HttpResponse response = httpClient.execute(httpGet);
您可以Ping知名的公共站點,例如Google的公共DNS服務器: 8.8.8.8 and 8.8.4.4
, www.cnn.com
, www.yahoo.com
等。
這將是進行“健全性”檢查的好方法。 (請確保在后台線程中執行此操作,以防設備未連接到互聯網。另外,我會混合/匹配1個IP和1個域名,這樣您就可以告訴用戶“為什么”您的應用是“連接。
但是,您可能僅應在與服務器的連接嘗試失敗后執行此操作。 (如進行健全性檢查以判斷您的網站是否關閉)
然后,如果您能夠ping通這些站點,則嘗試使用完整的HTTP連接並驗證所獲取的“頁面”是否“正確”。 不只是HTTP響應代碼。 因為您的ISP可能使用重定向你的網站流量的HTTP MITM(中間人) 是否會返回200,因為它是一個“有效”網頁...但不是'所需的頁面。
您可以通過在服務器上制作幾個字節的網頁來輕松檢查此部分,該網頁只包含HTML標題“ HTTP CHECK”和“ GOOD”或類似正文的內容。 然后,驗證您的應用是否可以訪問該頁面(實際上是檢查HTML內容),而不是“其他”內容(例如Paywall)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.