首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConnectivityManager只能检测连接,而不能检测网络可用性

ConnectivityManager只能检测连接,而不能检测网络可用性
EN

Stack Overflow用户
提问于 2020-12-11 15:19:15
回答 1查看 51关注 0票数 0

下面的代码用于检测网络连接。这种情况是软件连接到手机的热点,但手机的蜂窝网络没有开机。下面的代码返回isConnected = true,这意味着它只检测连通性?问题是我如何更改它以检测网络可用性?

代码语言:javascript
复制
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
}

}

EN

回答 1

Stack Overflow用户

发布于 2020-12-12 03:38:11

您正在对NetworkInfo使用已弃用的API。您应该使用NetworkCapabilities.NET_CAPABILITY_VALIDATED

表示已成功验证此网络上的连通性。例如,对于具有NET_CAPABILITY_INTERNET的网络,这意味着已成功检测到互联网连接。

SDK >= 23

您可以将您的代码更改为类似下面的代码,以查看这是否是用于确认互联网连接的true

代码语言:javascript
复制
connectivityManager
.getNetworkCapabilities(connectivityManager.getActiveNetwork())
.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)

软件开发工具包>= 21

如果您使用的是SDK21之前的版本,可以使用ConnectivityManager.registerNetworkCallback接口。

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65247226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档