簡體   English   中英

檢查設備是否確實已連接到互聯網android

[英]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.4www.cnn.comwww.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM