ConnectivityManager 的 getAllNetworkInfo() 在 API 23 上被弃用,它的注释说使用 getAllNetworks() 代替。
但是我发现这些没有相同的行为。
例如,如果手机有可用的 Activity 蜂窝网络,但当前 wifi 已打开,则 getAllNetworkInfo() 将返回两个网络(它将显示 wifi 为已连接,蜂窝为已断开连接)。
但是 getAllNetwork() 在这种情况下只返回 wifi 网络。如果wifi关闭,则它将返回蜂窝网络。换句话说,它似乎只返回当前 Activity 的网络(但是还有另一种方法,即 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");
}
}
最佳答案
你为什么不使用 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());
});