getAllNetworkInfo()在M中已弃用,但其替换具有不同的行为

时间:2015-10-27 17:32:20

标签: android android-6.0-marshmallow

ConnectivityManager的getAllNetworkInfo()在API 23上已弃用,其注释表示使用getAllNetworks()。 但是我发现这些行为没有相同的行为。

例如,如果手机有可用的活动蜂窝网络但是当前打开了wifi,那么getAllNetworkInfo()将返回两个网络(它将显示wifi连接,蜂窝连接显示)。

然而,getAllNetwork()仅在这种情况下返回wifi网络。如果关闭wifi,它将返回蜂窝网络。换句话说,它似乎只返回当前活动的网络(但是有另一种方法,即getActiveNetworkInfo())。

除了只返回一个网络的getAllNetworkInfo()之外,getAllNetworks()也只是退出一个网络。

使用Marshmallow,我如何获得与getAllNetworkInfo()相同的行为,即获取所有可用网络的列表,无论它们是断开连接还是已连接?

最终我想知道蜂窝数据连接是否可用。目前,使用新的ConnectivityManager API,我看不到任何方法。

如果下面的代码符合SDK 22并在M上运行,那么它会列出两个网络,如果getAllNetworkInfo()被替换为getAllNetworks()(以及Network< - > NetworkInfo的相应更改)并使用SDK23编译并运行在同一台设备上,只列出了一个网络。

 public static synchronized void checkNetworkConnectivity ()
{
        Context context;
        context = CityIdApplication.getHandsetState().getContext();
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

         NetworkInfo [] networks = cm.getAllNetworkInfo();
        //Network[] networks = cm.getAllNetworks();
        if (networks != null) {
            for (Network network : networks) {
                NetworkInfo info = cm.getNetworkInfo(network);
                if (info.isAvailable()) {
                    if (info.isConnected()) {
                        Log.v(TAG, "== NETWORK type: " + info.getTypeName() + "[" + info.getSubtypeName()
                                + "], state: " + info.getDetailedState());
                    } else
                        Log.v(TAG, "== NETWORK type: " + info.getTypeName() + "[" + info.getSubtypeName()
                                + "], state: " + info.getDetailedState() + "=== isAvailable");
                } else
                    Log.v(TAG, "== NETWORK type: " + info.getTypeName() + "[" + info.getSubtypeName()
                            + "], state: " + info.getDetailedState() + "=== NOT Available");
            }
    }

1 个答案:

答案 0 :(得分:-1)

为什么不使用registerNetworkCallback

NetworkRequest request = new NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
    .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .build();
final ConnectivityManager manager = getSystemService(ConnectivityManager.class);
manager.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback(){
    @Override
    public void onAvailable(Network network) {
        NetworkInfo info = manager.getNetworkInfo(network);
        Log.v(TAG, "== NETWORK type: " + info.getTypeName() + "[" + info.getSubtypeName() + "], state: " + info.getDetailedState());
    });