我需要告诉我的设备是否有Internet连接 . 我找到了许多答案,如:
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;
}
(摘自检测Android上是否有可用的Internet连接 . )
但这不对,例如,如果我 connected to a wireless network which doesn't have Internet access ,这个方法将返回true ... Is there a way to tell if the device has Internet connection and not if it is only connected to something?
9 回答
你是对的 . 您提供的代码仅检查是否存在网络连接 . 检查是否存在活动Internet连接的最佳方法是尝试通过http连接到已知服务器 .
当然,您可以将
http://www.google.com
URL替换为您要连接的任何其他服务器,或者您知道的服务器具有良好的正常运行时间 .正如Tony Cho在this comment below中指出的那样,请确保您不会获得NetworkOnMainThread异常(在Android 3.0或更高版本中) . 请改用AsyncTask或Runnable .
如果你想使用google.com,你应该看看Jeshurun的修改 . 在his answer中,他修改了我的代码并使其更有效率 . 如果你连接到
然后检查204的响应代码
那么你不必先获取整个谷歌主页 .
我稍微修改了THelper的答案,使用Android已经用来检查连接的WiFi网络是否可以访问Internet的已知黑客 . 这比 grab 整个Google主页更有效率 . 有关详细信息,请参阅here和here .
如果互联网实际可用,则返回true
确保您拥有这两项权限
如果您的目标是Lollipop或更高版本,则可以使用新的NetworkCapabilities类,即:
试试这个
您不一定需要 Build 完整的HTTP连接 . 您可以尝试只打开与已知主机的TCP连接,如果成功,则可以连接互联网 .
然后检查:
根据接受的答案,我用一个监听器构建了这个类,所以你可以在主线程中使用它:
First :InterntCheck类在后台检查互联网连接,然后使用结果调用侦听器方法 .
Second :在主线程中实例化一个类的实例并等待响应(如果你已经使用过Firebase api for android,那么你应该熟悉它!) .
现在在onComplete方法中,您将获得设备是否已连接到互联网 .
希望上面的代码可以帮助您,同时确保您在我的应用程序中拥有互联网权限 .
从documentation执行此操作的最新方法是使用
ConnectivityManager
查询活动网络并确定它是否具有Internet连接 .将这两个权限添加到AndroidManifest.xml文件中: