android - getActiveNetworkInfo() 在 API 29 中已弃用

标签 android

我正在使用一段代码来检查用户是否有互联网 Activity ,但在定位 sdk29 后,以下功能已被弃用

NetworkInfo

NetworkInfo.isConnected()

getActiveNetworkInfo()

这是代码:

public static boolean isNetworkAvailable(Context context) {
    if(context == null) { return false; }
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    // if no network is available networkInfo will be null, otherwise check if we are connected
    try {
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
            Log.i("update_statut","Network is available : true");
            return true;
        }
    } catch (Exception e) {
        Log.i("update_statut",""+ e.getMessage());
    }
    Log.i("update_statut","Network is available : FALSE ");
    return false;
}

最佳答案

基于 Google Document 已弃用它

  • getActiveNetworkInfo 在 API 29 上已弃用。
  • getAllNetworkInfo 在 API 23 上已弃用。

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

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 {
        val nwInfo = connectivityManager.activeNetworkInfo ?: return false
        return nwInfo.isConnected
    }
}

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在这里。

关于android - getActiveNetworkInfo() 在 API 29 中已弃用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57277759/

相关文章:

android - 从 Google Drive 下载文件的问题

java - 是否可以通过编程方式更改 PieRenderer?

java - 打开文件输入(文件名) nullPointerException : FILENAME not null

android - 在位图上绘制文本

android - 如何在 koin 中正确添加两个模块?

单击 BadTokenException 时出现 Android Spinner 异常

java - 检查 ScrollView 是否已经到达布局的顶部

android - 复制 Android 项目文件夹不是完整备份?

java - 数据绑定(bind)在对话框中不起作用 - 为什么?

java - Android中goto语句的使用方法