ConnectivityManager.getActiveNetworkInfo() / NetworkInfo 在 API 29 中已弃用。有啥替代方案?

Posted

技术标签:

【中文标题】ConnectivityManager.getActiveNetworkInfo() / NetworkInfo 在 API 29 中已弃用。有啥替代方案?【英文标题】:ConnectivityManager.getActiveNetworkInfo() / NetworkInfo is deprecated in API 29. What's an alternative?ConnectivityManager.getActiveNetworkInfo() / NetworkInfo 在 API 29 中已弃用。有什么替代方案? 【发布时间】:2019-11-20 20:48:09 【问题描述】:

看起来像 API 29 上的整个 NetworkInfo is deprecated。

所以我正在寻找一种替代方法来检查网络是否已连接。 例如。替代

connectivityManager.activeNetworkInfo?.isConnected == true

旁注:我知道现在有回调,但我想同步获取此信息。另外,我当然知道这可能不是一个准确的信息,尽管我想拥有它。

【问题讨论】:

查看***.com/a/56437236/7666442 您链接到的确切页面描述了存在哪些替代方案。 【参考方案1】:

解决办法是这样的:

val capability = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
return capability?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) ?: false

【讨论】:

在此确认:developer.android.com/training/basics/network-ops/…【参考方案2】:

这适用于 API 29:

connectivityManager.isDefaultNetworkActive

【讨论】:

这似乎仍然返回true,即使在飞行模式下。 在飞行模式下可以有一个活跃的网络。引用Techopedia:In general, features like FM receiver, Bluetooth, Wi-Fi and GPS should still be operable even when the device is in airplane mode【参考方案3】:
android.net.NetworkInfo

此类在 API 级别 29 中已弃用。 您应该改用ConnectivityManager.NetworkCallback API 来了解连接更改

参考链接https://developer.android.com/reference/android/net/NetworkInfo.html

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();

connectivityManager.registerNetworkCallback(
                    builder.build(),
                    new ConnectivityManager.NetworkCallback() 

                        @Override
                        public void onAvailable(Network network) 
                            // Network Available
                        


                        @Override
                        public void onLost(Network network) 
                            // Network Not Available
                        
                    
            );

【讨论】:

【参考方案4】:

解决办法是

public void registerNetworkCallback()

    try 
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkRequest.Builder builder = new NetworkRequest.Builder();

        connectivityManager.registerNetworkCallback(builder.build(),new ConnectivityManager.NetworkCallback() 
                    @Override
                    public void onAvailable(Network network) 
                        Variables.isNetworkConnected = true; // Global Static Variable
                    
                    @Override
                    public void onLost(Network network) 
                        Variables.isNetworkConnected = false; // Global Static Variable
                    
                

        );
        Variables.isNetworkConnected = false;
    catch (Exception e)
        Variables.isNetworkConnected = false;
    

在此处查看完整代码:Gist

【讨论】:

【参考方案5】:
private boolean checkInternetConnection(Activity activity) 
    ConnectivityManager connectivityManager = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
        Network network = null;
        if (connectivityManager == null) 
            return false;
         else 
            network = connectivityManager.getActiveNetwork();
            NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network);
            if (networkCapabilities == null) 
                return false;
            
            if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
                    networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) 
                return true;
            
        
     else 
        if (connectivityManager == null) 
            return false;
        
        if (connectivityManager.getActiveNetworkInfo() == null) 
            return false;
        
        return connectivityManager.getActiveNetworkInfo().isConnected();
    
    return false;

【讨论】:

感谢您对社区的贡献。这可能是一个正确的答案,但对您的代码提供额外的解释会很有用,以便开发人员能够理解您的推理。这对于可能不熟悉语法的新开发人员特别有用。此外,它可以帮助减少对后续问题的需求。您介意用更多详细信息更新您的评论吗?

以上是关于ConnectivityManager.getActiveNetworkInfo() / NetworkInfo 在 API 29 中已弃用。有啥替代方案?的主要内容,如果未能解决你的问题,请参考以下文章