NetworkInfo已过时

今天编译的时候发现,请求网络前判断设备是否联网的方法提示警告,内容为NetworkInfo过时
赶紧点开查看过时说明,发现NetworkInfo在API level 29中过时,ConnectivityManager中有许多返回值为NetworkInfo的方法,自此一并不推荐使用了。
以前我们常用mConnectivityManager.getActiveNetworkInfo()获取NetworkInfo,通过isConnected()判断是否连通
查阅文档显示如下

@deprecated Callers should instead use the {@link ConnectivityManager.NetworkCallback} API to
 *             learn about connectivity changes, or switch to use
 *             {@link ConnectivityManager#getNetworkCapabilities} or
 *             {@link ConnectivityManager#getLinkProperties} to get information synchronously. Keep
 *             in mind that while callbacks are guaranteed to be called for every event in order,
 *             synchronous calls have no such constraints, and as such it is unadvisable to use the
 *             synchronous methods inside the callbacks as they will often not offer a view of
 *             networking that is consistent (that is: they may return a past or a future state with
 *             respect to the event being processed by the callback). Instead, callers are advised
 *             to only use the arguments of the callbacks, possibly memorizing the specific bits of
 *             information they need to keep from one callback to another.

官方提到了两个同步方法,和一个异步方法,官方警告说同步的方法会有更新不及时,反馈不及时的问题,无法保证多次调用的结果一致性。
但我主要为了判断瞬时网络通断,就使用返回NetworkCapabilities的getNetworkCapabilities

1)网络状态改变监听:异步方法ConnectivityManager.NetworkCallback (NetWork)
2)网络状态获取:同步方法
//获取网络属性
public NetworkCapabilities getNetworkCapabilities (@Nullable Network network)
方法内部调用的是:mService.getNetworkCapabilities(network);
//获取连接属性
public LinkProperties getLinkProperties(int networkType) 
    public LinkProperties getLinkProperties(@Nullable Network network)
方法内部调用的是:mService.getLinkPropertiesForType(networkType);

//注意 上述两个方法的Network是通过mConnectivityManager.getActiveNetwork()获取的

官方推荐的替代方案中使用的NetworkCapabilities,是API 21增加的类,但API23中才增加了判断的描述NET_CAPABILITY_VALIDATED,因此NetworkCapabilities最低支持Android 6.0版本.
实际使用时需要做版本判断,项目如需兼容早期版本则无法完全摒除NetworkInfo
参考帖子了中对NetworkCapabilities的测试,发现其描述中有“VALIDATED”字段时,此网络是真正可用的。

打印networkCapabilities.toString()

未联网
networkCapabilities=null

移动4G流量
NetworkCapalbilities:[ Transports: CELLULAR Capabilities: SUPL&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED Unwanted:  LinkUpBandwidth>=51200Kbps LinkDnBandwidth>=102400Kbps Specifier: <1>]

wifi
5G热点
NetworkCapalbilities:[ Transports: WIFI Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED Unwanted:  LinkUpBandwidth>=1048576Kbps LinkDnBandwidth>=1048576Kbps SignalStrength: -46]
4G热点
NetworkCapalbilities:[ Transports: WIFI Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED LinkUpBandwidth>=1048576Kbps LinkDnBandwidth>=1048576Kbps SignalStrength: -53]

本次只用了热点wifi做测试,但已经看出来4G和5G有一些差别

结合参考文档中测试的两种情况
1)在不可上网的wifi下,可以看到也没有VALIDATED的标记
在不可上网的wifi下,可以看到也没有VALIDATED的标记
2)在需要认证的wifi下,可以看到相应区域没有VALIDATED的标记
在需要认证的wifi下,可以看到相应区域没有VALIDATED的标记
综合上述信息,NetworkCapabilities的描述中有VALIDATED这个描述时,此网络是真正可用的。那么我们可以:

1)通过判断这个标记是否存在来判断网络的连通性
networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
2)通过字符串转义抓取判断
networkCapabilities.toString().indexOf("VALIDATED") > -1;

综合以上情况修改网络判断代码如下:

public static boolean isConnected() {
	ConnectivityManager mConnectivityManager = (ConnectivityManager) BaseApplication.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
	if(Build.VERSION.SDK_INT>=23) {
		//获取网络属性
		NetworkCapabilities networkCapabilities = mConnectivityManager.getNetworkCapabilities(mConnectivityManager.getActiveNetwork());
		if (networkCapabilities != null) {
			LogUtil.i("Avalible","NetworkCapalbilities:"+networkCapabilities.toString());
			return networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
		}
	}else {
		NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
		if (mNetworkInfo != null) {
			return mNetworkInfo.isConnected();
		}
	}
	return false;
}
发布了66 篇原创文章 · 获赞 5 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/yuemitengfeng/article/details/105538802