我需要知道我的设备是否连接了互联网.我找到了很多答案,比如:

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
         = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null;
}

(取自Detect whether there is an Internet connection available on Android.)

但这是不对的,例如,如果我是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?

推荐答案

你是对的.您提供的代码仅判断是否存在网络连接.

public static boolean hasActiveInternetConnection(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
            urlc.setRequestProperty("User-Agent", "Test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 200);
        } catch (IOException e) {
            Log.e(LOG_TAG, "Error checking internet connection", e);
        }
    } else {
        Log.d(LOG_TAG, "No network available!");
    }
    return false;
}

当然,你可以用http://www.google.com URL来代替你想连接的任何其他服务器,或者你知道的正常运行时间很长的服务器.

正如Tony Cho在this comment below中指出的,确保不要在主线程上运行此代码,否则会出现NetworkOnMainThread异常(在Android 3.0或更高版本中).改用AsyncTask或Runnable.

如果你想使用谷歌.你应该看看耶书仑的修改.在his answer年,他修改了我的代码,使之更有效率.如果你连接到

HttpURLConnection urlc = (HttpURLConnection) 
            (new URL("http://clients3.google.com/generate_204")
            .openConnection());

然后判断204的响应代码

return (urlc.getResponseCode() == 204 && urlc.getContentLength() == 0);

这样你就不必先获取整个谷歌主页.

Android相关问答推荐

如何将Hilt添加到Android Studio中的Kotlin项目中?

如何在"不同活动"中添加不同按钮?

list 合并失败,AGP 8.3.0

懒惰的垂直网格中盒子的重量-Jetpack组合

无法将项目添加到文件室数据库

如何在Android Jetpack Compose中找到我的手机屏幕一行有多少个单词

如何更新Kotlin中的显示?

在 kotlin 协同 routine 中,如何将数据范围限定为请求路径(以 MDC 为例)?

在 Material 3 TopAppBar 代码的哪个位置定义了填充?

延时kotlin中时分秒的使用方法

AirDroid Business 如何能够从屏幕截图中排除覆盖?

为什么我的应用程序使用这些信息?

如何在 Jetpack Compose 中向图像视图添加对角色带?

如何在 Jetpack Compose 中禁用 Horizo​​ntalPager 的分页动画

如何在屏幕旋转或系统主题更改后将光标移动到 TextField 的末尾并保持键盘显示?

无法通过 retrofit 解析对 kotlin 数据类的 xml 响应

缺少类 com.google.android.datatransport.runtime.ForcedSender

如何使用底页,启用和展开父交互

不能在kotlin的lazycolumn中使用列表

为什么在try 实例化 Mediaplayer 时会出现 NullPointerException?安卓Kotlin