API 29中已弃用getActiveNetworkInfo()

时间:2019-07-30 18:15:07

标签: android

我正在使用一个代码来检查用户是否已激活互联网,但是在定位了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;
}

3 个答案:

答案 0 :(得分:16)

基于Google Document

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

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

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

答案 1 :(得分:9)

我终于找到了可以在所有API上使用的代码,以防有人需要

NetworkCapabilities在API 29中并未被弃用,但它需要API 21,因此我仅在API 29上调用过它。

然而,仅在API 29中弃用了getActiveNetworkInfo(),并且只能在所有API上使用,因此我们可以在所有29以下的api中使用它

这是代码

    public static boolean isNetworkAvailable(Context context) {
    if(context == null)  return false;


    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (connectivityManager != null) {


    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
            if (capabilities != null) {
                if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    return true;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    return true;
                }  else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)){
                    return true;
                }
            }
        }

    else {

        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;
}

答案 2 :(得分:1)

您可以在official doc

中找到所有信息
  

该类已在API级别29中弃用。
  调用者应该改用ConnectivityManager.NetworkCallback API来了解连通性更改,或者改用ConnectivityManager#getNetworkCapabilitiesConnectivityManager#getLinkProperties来同步获取信息。请记住,虽然保证按顺序对每个事件都调用回调,但是同步调用没有这样的约束,因此不建议在回调内部使用同步方法,因为它们通常不会提供网络视图这是一致的(也就是说:对于回调正在处理的事件,它们可能返回过去或将来的状态)。相反,建议呼叫者仅使用回调的参数,可能会记住从一个回调到另一个回调所需的特定信息。

您可以使用类似的内容:

0 but true