API 29已经弃用了NetworkInfo。

18

我想检查网络连接。因此,我使用了ConnectivityManager.activateNetworkInfo.isConnected

不幸的是,在API 29中已弃用该方法。

private fun isOnline(): Boolean {
    val connectivityManager = appContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val networkInfo = connectivityManager.activeNetworkInfo
    return networkInfo != null && networkInfo.isConnected
}

此处可以看到折旧信息

在这里输入图像描述


@AhmadSabeh,愿他安息:问题不在于TYPE... - A.R.B.N
@Quicklearner,谢谢你,但问题已经解决了。 - A.R.B.N
1个回答

79

根据Google文档,此方法已经被弃用:

  • 在API 29上,getActiveNetworkInfo被弃用。
  • 在API 23上,getAllNetworkInfo被弃用。

因此,如果您想查找网络连接状态,可以使用此代码。

kotlin:

 private fun isNetworkAvailable(context: Context): Boolean {
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        val nw      = connectivityManager.activeNetwork ?: return false
        val actNw = connectivityManager.getNetworkCapabilities(nw) ?: return false
        return when {
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
            //for other device how are able to connect with Ethernet
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
            //for check internet over Bluetooth
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) -> true
            else -> false
        }
    } else {
        return connectivityManager.activeNetworkInfo?.isConnected ?: false
    }
}

Java :

Java:
private Boolean isNetworkAvailable(Application application) {
    ConnectivityManager connectivityManager = (ConnectivityManager) application.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Network nw = connectivityManager.getActiveNetwork();
        if (nw == null) return false;
        NetworkCapabilities actNw = connectivityManager.getNetworkCapabilities(nw);
        return actNw != null && (actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) || actNw.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH));
    } else {
        NetworkInfo nwInfo = connectivityManager.getActiveNetworkInfo();
        return nwInfo != null && nwInfo.isConnected();
    }
}

您可以在此处查看所有的NetworkCapability。


4
运作得像魔法一样! - SwiftiSwift
非常好用,谢谢。关于 Kotlin 版本的一个评论,您可以将连接管理器转换为可空的 ConnectivityManager? 并检查 null 以避免 NPE。 - ytilliette
你好,nwInfo.isConnected(); 在Api 29中仍然被弃用。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接