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,会变成N 在办公软件中输入字母M会变成字母N,但在QQ聊天中
我们能否找到元素是不是存在于数组 1,2,...,n 中,其中元素 m 个不同的元素在 Θ(m) 中? [关闭]