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

标签 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,此方法有效。但是,在我的情况下,提供商只是停止了互联网,因为我已经达到了我的使用限制或用完了数据限额。因此,在这种情况下,该方法返回 TRUE,即使当我转到浏览器并输入 google.com 时它不起作用并且我从提供者处收到消息说我已达到我的限制?因此,即使由于使用限制我无法从设备打开它,google.com 还是可以 ping 通?我只能访问我的移动提供商的网页,在那里我可以购买更多配额,这样互联网就不会被关闭,而只会受到限制。我该如何检查?

最佳答案

您可以 Ping 众所周知的公共(public)站点,例如 Google 的公共(public) DNS 服务器:8.8.8.8 和 8.8.4.4www.cnn.comwww.yahoo.com

这将是进行“完整性”检查的好方法。 (确保在后台线程中执行此操作,以防设备未连接到互联网。另外,我会混合/匹配 1 个 IP 和 1 个域名,这样你就可以告诉用户“为什么”你的应用程序是“连接。

但是您应该只在尝试连接到您的服务器失败后才执行此操作。 (作为健全性检查以判断您的网站是否已关闭)


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

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

关于android - 检查设备是否真的连接到互联网 android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34445262/

相关文章:

java - 使用 Android 登录 Google 连接时出现错误

Android Crypto++ 命令行编译,GNUmakefile

android - 启动配置 Activity 时调用的小部件 onUpdate

java - 如何将参数传递给 android junit 测试(参数化测试)

android - 获取 Item recyclerView 的文本

android - 图片从SD卡到byte[]

java - Android 设计模式,Realm 中用于组合的单例对象类?

java - 在Android Studio-3.6.2中离线安装gradle

java - 从另一个 Activity 的返回堆栈中删除一个 Activity ?

android - Nougat Camera API 中的 USB 网络摄像头支持