下面的代码用于检测网络连接。这种情况是软件连接到手机的热点,但手机的蜂窝网络没有开机。下面的代码返回isConnected = true,这意味着它只检测连通性?问题是我如何更改它以检测网络可用性?
fun Context.isOnline(): Boolean {
val connectivityManager =
this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkInfo = connectivityManager.activeNetworkInfo
if (networkInfo == null) {
log(message = "Network info is **NULL**")
return false
} else {
val isConnected = when(networkInfo.detailedState) {
NetworkInfo.DetailedState.CONNECTING -> true
NetworkInfo.DetailedState.AUTHENTICATING -> true
NetworkInfo.DetailedState.OBTAINING_IPADDR -> true
NetworkInfo.DetailedState.CONNECTED -> true
NetworkInfo.DetailedState.VERIFYING_POOR_LINK -> true
else -> false
}
if (!isConnected) {
log(message = "Network state is **${networkInfo.detailedState?.name ?: "NULL"}**")
}
return isConnected
}}
发布于 2020-12-12 03:38:11
您正在对NetworkInfo使用已弃用的API。您应该使用NetworkCapabilities.NET_CAPABILITY_VALIDATED
表示已成功验证此网络上的连通性。例如,对于具有NET_CAPABILITY_INTERNET的网络,这意味着已成功检测到互联网连接。
SDK >= 23
您可以将您的代码更改为类似下面的代码,以查看这是否是用于确认互联网连接的true:
connectivityManager
.getNetworkCapabilities(connectivityManager.getActiveNetwork())
.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)软件开发工具包>= 21
如果您使用的是SDK21之前的版本,可以使用ConnectivityManager.registerNetworkCallback接口。
boolean isConnected = false;
final NetworkRequest request =
new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build();
final ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkCallback networkCallback = new NetworkCallback() {
@Override
void onAvailable(Network network) {
// Triggers when this network is available.
isConnected = true;
}
@Override
void onLost(Network network) {
// Triggers when this network is lost.
isConnected = false;
}
};
connectivityManager.requestNetwork(request, networkCallback);https://stackoverflow.com/questions/65247226
复制相似问题