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

Posted

技术标签:

【中文标题】getAllNetworkInfo() 在 M 中已弃用,但它的替换具有不同的行为【英文标题】:getAllNetworkInfo() is deprecated in M but its replacement has difference behavior 【发布时间】:2016-01-27 06:21:54 【问题描述】:

ConnectivityManager 的 getAllNetworkInfo() 在 API 23 上已弃用,它的 cmets 说要改用 getAllNetworks()。 但是我发现这些没有相同的行为。

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

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

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

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

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

如果下面的代码符合 SDK 22 并在 M 上运行,那么它会列出两个网络,如果 getAllNetworkInfo() 被交换为 getAllNetworks()(以及 NetworkNetworkInfo 的相应更改)并使用 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");
            
    

【问题讨论】:

调用getAllNetworkInfo会抛出什么异常?我在 android M (API 23) 模拟器中测试 getAllNetworkInfo 仍然有效(尽管编译时带有弃用警告)。 @kzz,我把它扔错了。其他一些 CM 方法现在会抛出,例如 startUsingNetworkFeature() 尝试挖掘android的源码。 :) 我相信他们改变了 API 的行为。并且没有“合法”的方式来实现你想要的。 或者您可能想在他们的开发者论坛上发布您的问题:source.android.com/source/community.htmldeveloper.android.com/support.html 【参考方案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());
    );

【讨论】:

以上是关于getAllNetworkInfo() 在 M 中已弃用,但它的替换具有不同的行为的主要内容,如果未能解决你的问题,请参考以下文章

如何在 M:M 中强制执行 1:M 关系?

为啥我的键盘字母在办公软件中输入M,会变成N 在办公软件中输入字母M会变成字母N,但在QQ聊天中

在matlab中,M脚本文件和M函数文件的主要区别是啥?

我们能否找到元素是不是存在于数组 1,2,...,n 中,其中元素 m 个不同的元素在 Θ(m) 中? [关闭]

如何在 MSVC 中高效地将两个 __m128d 转换为一个 __m128i?

转:在linux中vi 文件里行尾奇怪的^M及解决