Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 检查设备是否真的连接到互联网_Android - Fatal编程技术网

Android 检查设备是否真的连接到互联网

Android 检查设备是否真的连接到互联网,android,Android,我正在开发一个android应用程序,我需要使用以下方法检查设备是否真正连接到互联网 cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isAvailable()

我正在开发一个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是可访问的,即使由于使用限制,我无法从设备上打开它?我只能访问我的手机供应商的网页,在那里我可以购买更多的津贴,这样互联网就不会被关闭,而是受到限制。我如何检查呢?

你可以Ping著名的公共站点,比如谷歌的公共DNS服务器:
8.8.8.8和8.8.4.4
www.cnn.com
www.yahoo.com
,等等

这将是一个进行“理智”检查的好方法。(确保在后台线程中,如果设备没有连接到Internet,那么我将混合/匹配1个IP和1个域名,这样你就可以告诉用户为什么你的应用程序没有连接。 但是,您可能只应该在尝试连接到服务器失败后才执行此操作


然后,如果您能够ping这些站点,请尝试完整的HTTP连接,并验证您获得的“页面”是否“正确”。不仅仅是HTTP响应代码。因为HTTP MITM(中间的人)您的ISP可能正在使用它重定向您的web流量,它将返回200,因为它是一个“有效”页面…但不是“所需”页面


你可以通过在服务器上制作一个只有几个字节的网页来轻松检查这一部分,该网页的正文中只有一个HTML标题“HTTP check”和“GOOD”或类似的内容。然后验证你的应用程序是否获得了该页面(实际检查HTML内容),而不是“其他内容”(如付费墙).

执行此操作的最佳方法是实现超时异常

HttpGet-HttpGet=newhttpget(url);
HttpParams httpParameters=新的BasicHttpParams();
//以毫秒为单位设置超时,直到建立连接。
//默认值为零,表示不使用超时。
int timeoutConnection=3000;
HttpConnectionParams.setConnectionTimeout(httpParameters,timeoutConnection);
//设置默认套接字超时(SO\U超时)
//以毫秒为单位,这是等待数据的超时。
int timeoutSocket=5000;
HttpConnectionParams.setSoTimeout(httpParameters,timeoutSocket);
DefaultHttpClient httpClient=新的DefaultHttpClient(httpParameters);

HttpResponse response=httpClient.execute(httpGet);
最好是ping一个名称服务器我假设问题是谷歌返回了一些东西,该页面说你已经达到了上限,因为它是http,所以没有什么可以说它不是谷歌说的(即使作为一个人,你知道这不是事实).您是否尝试过https,它会拒绝连接到您的isp而不是返回google