【问题标题】:Android check internet connection in kotlinAndroid 在 kotlin 中检查互联网连接
【发布时间】:2021-03-17 15:00:24
【问题描述】:

我需要检查设备是否有互联网连接,我搜索了一些示例,但是当我复制并粘贴代码时,我总是遇到错误或不推荐使用的功能。我也不明白我必须把检查连接的方法放在哪里,因为我需要在 viewModel 中检查互联网连接以发出一些请求,而且我发现的所有方法在参数中都有上下文,我不能在 viewModel 中获取上下文。

我尝试了这段代码,但我不明白我必须把它放在哪里,然后我得到了

'TYPE_WIFI, TYPE_MOBILE, TYPE_ETHERNET: Int' is deprecated. Deprecated in Java

private fun isInternetAvailable(context: Context): Boolean {
        var result = false
        val connectivityManager =
            context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            val networkCapabilities = connectivityManager.activeNetwork ?: return false
            val actNw =
                connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
            result = when {
                actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
                actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
                actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
                else -> false
            }
        } else {
            connectivityManager.run {
                connectivityManager.activeNetworkInfo?.run {
                    result = when (type) {
                        ConnectivityManager.TYPE_WIFI -> true
                        ConnectivityManager.TYPE_MOBILE -> true
                        ConnectivityManager.TYPE_ETHERNET -> true
                        else -> false
                    }

                }
            }
        }

        return result
    }

谁能解释我如何进行这项检查?

【问题讨论】:

标签: android kotlin


【解决方案1】:

我创建了一个助手类。 Network.kt

object Network {
    private const val NETWORK_STATUS_NOT_CONNECTED = 0
    private const val NETWORK_STATUS_WIFI = 1
    private const val NETWORK_STATUS_MOBILE = 2
    private const val TYPE_WIFI = 1
    private const val TYPE_MOBILE = 2
    private const val TYPE_NOT_CONNECTED = 0
    private fun connectivityStatus(context: Context): Int {
        val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val activeNetwork = connectivityManager.activeNetworkInfo
        if (null != activeNetwork) {
            if (activeNetwork.type == ConnectivityManager.TYPE_WIFI) return TYPE_WIFI
            if (activeNetwork.type == ConnectivityManager.TYPE_MOBILE) return TYPE_MOBILE
        }
        return TYPE_NOT_CONNECTED
    }


    private fun connectivityStatusString(context: Context): Int {
        val connection = connectivityStatus(context)
        var status = -1
        if (connection == TYPE_WIFI) status = NETWORK_STATUS_WIFI else if (connection == TYPE_MOBILE) status = NETWORK_STATUS_MOBILE else if (connection == TYPE_NOT_CONNECTED) status = NETWORK_STATUS_NOT_CONNECTED
        return status
    }

    fun checkConnectivity(context : Context):Boolean{
        val status = connectivityStatusString(context)
        return status == NETWORK_STATUS_WIFI || status == NETWORK_STATUS_MOBILE
    }
}

要访问它,您需要像这样使用它

if (Network.checkConnectivity(this@MainActivity))
    \\Internet is working
else
    \\No internet connectivity

【讨论】:

  • IDE 在if (Network.checkConnectivity(this@MainActivity)) 中的@MainActivity 上显示错误
  • 您可以像 if (Network.checkConnectivity(this)) 一样使用它,也可以将MainActivity 替换为您当前的活动名称。
  • 但是我在viewModel中使用它,包含Fragment的Activity是MainActivity但是IDE显示这个错误
  • 该函数需要上下文。将上下文传递给它,错误就会消失。
  • 有什么关系。这仅显示是否有 wifi 或移动连接。如果他们有互联网,则不会。
【解决方案2】:

您必须扩展 AndroidViewModel() 类。之后,您可以在 viewModel 中访问应用程序上下文。

class viewModel(app: Application): AndroidViewModel(app) {}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2016-08-28
    相关资源
    最近更新 更多