ConnectivityManager.getActiveNetworkInfo() / NetworkInfo在API 29中已被弃用,有什么替代方法?

5

看起来整个NetworkInfo类在API 29上已被弃用。

因此,我正在寻找一种替代方法来检查网络是否已连接。 例如,可以使用以下替代方法:

connectivityManager.activeNetworkInfo?.isConnected == true

顺便说一句:我知道现在有回调函数,但我想同步获取这些信息。当然,我知道这可能不是很精确的信息,但我还是想要它。


请查看此链接 https://stackoverflow.com/a/56437236/7666442 - AskNilesh
您所链接的确切页面描述了有哪些替代方案。 - Zun
5个回答

4
这个问题的解决方案是:
val capability = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
return capability?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) ?: false

1
已确认:https://developer.android.com/training/basics/network-ops/reading-network-state - Blundell

1

这是在API 29上工作的:

connectivityManager.isDefaultNetworkActive

似乎即使在飞行模式下,这仍然返回true。 - hrach
在飞行模式下仍然可以拥有活跃的网络。引用Techopedia的话:“通常情况下,即使设备处于飞行模式,FM接收器、蓝牙、Wi-Fi和GPS等功能仍应该可操作。” - Zun

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

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

感谢您为社区做出的贡献。这可能是一个正确的答案,但提供代码的额外解释以便开发人员理解您的推理会更有用。对于可能不熟悉语法的新开发人员来说,这尤其有用。此外,它可以帮助减少后续问题的需要。您介意在评论中更新附加详细信息吗? - Jeremy Caney

0

解决方案是

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


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