使用 NetworkCapabilities 和 ConnectivityManagerCompat 确定网络是否按流量计费有什么区别?

What's the difference between determining if a network is metered using NetworkCapabilities and ConnectivityManagerCompat?

我发现有两种方法可以检测当前网络是否被计费:

  1. NetworkCapabilities.hasCapability(NET_CAPABILITY_NOT_METERED)NetworkCapabilities
  2. ConnectivityManagerCompat.isActiveNetworkMeteredConnectivityManagerCompat

那么,这些方法有什么区别呢?什么时候使用它们?

首先:ConnectivityManagerCompat.isActiveNetworkMetered 只是框架 ConnectivityManager.isActiveNetworkMeteredandroidx backport。

在有该方法的平台上(API 16+),兼容版本直接调用框架方法。否则,它 tries to guess based on the connection type:假定 Wi-Fi、蓝牙和以太网连接是非计量的,而其他任何连接都假定是计量的。这个猜测不一定正确(例如,可以对 Wi-Fi 网络进行计量),但这是您在 API 水平上可以做出的最佳猜测。你应该在(现在不太可能)需要定位 API 15 或以下的情况下使用它。

ConnectivityManager.isActiveNetworkMeteredNetworkCapabilities.hasCapability(NET_CAPABILITY_NOT_METERED) 之间的区别而言:对于活动数据网络,它们完全相同,因为 implementation 只是调用了那个确切的方法。

但是,因为 hasCapability 可以在 任何 网络上调用,所以如果您想要活动数据网络以外的网络功能,它会为您提供更大的灵活性。