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");
}
}
答案 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());
});