【问题标题】:Network connection check always return false for some Android devices对于某些 Android 设备,网络连接检查总是返回 false
【发布时间】:2021-03-28 19:33:43
【问题描述】:

我正在使用此方法检查网络连接,但有些用户即使已连接到 Internet,也会收到“没有 Internet 连接”错误。用户审查过; 华为 Mate 10 Lite、LGE V20、华硕 Zenfone、三星 Galaxy A8

我的方法:

private fun isConnectionOn(): Boolean {
    val connectivityManager =
        appContext.getSystemService(Context.CONNECTIVITY_SERVICE) as
                ConnectivityManager

    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        postAndroidMInternetCheck(connectivityManager)
    } else {
        preAndroidMInternetCheck(connectivityManager)
    }
}

@RequiresApi(Build.VERSION_CODES.M)
private fun postAndroidMInternetCheck(
    connectivityManager: ConnectivityManager
): Boolean {
    val network = connectivityManager.activeNetwork
    val connection =
        connectivityManager.getNetworkCapabilities(network)

    return connection != null && (
            connection.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
                    connection.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))
}

private fun preAndroidMInternetCheck(
    connectivityManager: ConnectivityManager
): Boolean {
    val activeNetwork = connectivityManager.activeNetworkInfo
    if (activeNetwork != null) {
        return (activeNetwork.type == ConnectivityManager.TYPE_WIFI ||
                activeNetwork.type == ConnectivityManager.TYPE_MOBILE)
    }
    return false
}

【问题讨论】:

    标签: android kotlin android-connectivitymanager


    【解决方案1】:

    验证您已连接到 Wi-Fi 或蜂窝网络并不能准确地告诉您您是否有互联网连接。如果你开车穿过带有蜂窝网络的隧道怎么办?如果您通过 Wi-Fi 连接到您无法访问的强制门户会怎样?即使您没有互联网连接,在这两种情况下您仍然会返回 true。这些只是几个示例,但重点是,您不应该使用传输来验证连接性。

    您应该用来验证连接性的两个功能是NET_CAPABILITY_INTERNETNET_CAPABILITY_VALIDATED

    NET_CAPABILITY_INTERNET 在 API 级别 21 中添加

    public static final int NET_CAPABILITY_INTERNET 表示这个 网络应该能够连接到互联网。

    NET_CAPABILITY_VALIDATED 在 API 级别 23 中添加

    public static final int NET_CAPABILITY_VALIDATED 表示 此网络上的连接已成功验证。例如, 对于具有 NET_CAPABILITY_INTERNET 的网络,这意味着 Internet 已成功检测到连接。

    因此,对于 Android >= M,您可以像这样更新您的代码:

    return connection != null && (
                connection.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) &&
                        connection.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED))
    

    对于 Android NetworkInfo#isConnected() 或 NetworkInfo#isConnectedOrConnecting()

    public boolean isConnected()

    指示是否存在网络连接以及是否可以 建立连接并传递数据。

    在尝试执行数据事务之前总是调用它。

    因此,对于 Android

    if (activeNetwork != null) {
        return activeNetwork.isConnectedOrConnecting();
    }
    

    【讨论】:

    • 我会试试这些,谢谢。如果分析中的错误消失,我会将您的答案标记为已接受,再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多