为您的应用添加 5G 功能

Android 11 增加了在应用中支持 5G 的功能。本主题涵盖了这些功能,并概述了向应用添加 5G 特定功能如何改善用户体验。

为 5G 构建

在决定如何与 5G 结合时,请考虑您希望构建哪种类型的体验。5G 增强您的应用的一些方式包括:

  • 由于 5G 的速度和延迟改进,自动使现有体验更快更好。
  • 提升用户体验,例如通过显示 4K 视频或下载更高分辨率的游戏资源。
  • 在确认增加的数据使用量不会给用户带来额外费用后,可以包含通常只通过 Wi-Fi 提供的体验,例如主动下载通常为不计量 Wi-Fi 保留的内容。
  • 提供 5G 独有的体验,这些体验仅在高速度和低延迟下有效。

5G 功能

Android 11 引入了以下功能变更和增强功能:

检查计量性

`NET_CAPABILITY_TEMPORARILY_NOT_METERED` 是 Android 11 中新增的一项功能,它会根据蜂窝运营商提供的信息,告知您当前使用的网络是否为非计量网络。

新标志与 `NET_CAPABILITY_NOT_METERED` 一起使用。现有标志指示网络是否始终为非计量网络,并且适用于 Wi-Fi 和蜂窝连接。

这两个标志之间的区别在于,`NET_CAPABILITY_TEMPORARILY_NOT_METERED` 可能会在网络类型不变的情况下发生更改。以 Android 11 为目标的应用可以使用 `NET_CAPABILITY_TEMPORARILY_NOT_METERED` 标志。在 Android 9 及更低版本设备上,操作系统不会报告该标志。对于在 Android 10 上运行的应用,此标志可能会可用,具体取决于运行它的设备。

一旦您确定当前网络是临时或永久非计量的,您就可以显示更高分辨率的内容(例如 4K 视频)、上传日志、备份文件以及主动下载内容。

以下部分介绍了向应用添加计量性检查的步骤。

注册网络回调

使用 `ConnectivityManager.registerDefaultNetworkCallback()` 注册网络回调,以便在 `NetworkCapabilities` 更改时接收通知。您可以通过替换 `NetworkCallback` 中的 `onCapabilitiesChanged()` 方法来检测 `NetworkCapabilities` 的更改。

`registerDefaultNetworkCallback()` 会导致注册的回调在注册时立即触发,从而向应用提供有关当前状态的信息。当状态从未计量变为计量或反之亦然时,将来的回调对于应用采取适当行动至关重要。

检查计量性

使用您在网络回调中收到的 `NetworkCapabilities` 对象来检查以下代码的输出:

Kotlin

NetworkCapabilities.hasCapability(NET_CAPABILITY_NOT_METERED) ||
  NetworkCapabilities.hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)

Java

NetworkCapabilities.hasCapability(NET_CAPABILITY_NOT_METERED) ||
  NetworkCapabilities.hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)

如果值为 true,则可以将该网络视为非计量网络。

其他注意事项

使用此功能时,请记住以下几点:

  • 使用 `NET_CAPABILITY_TEMPORARILY_NOT_METERED` 标志要求您针对 Android 11 SDK 编译您的应用。

  • `NET_CAPABILITY_NOT_METERED` 功能在网络上是永久性的。具有此功能的网络如果失去该功能(变为计量网络),将自动断开连接。

  • 相比之下,`NET_CAPABILITY_TEMPORARILY_NOT_METERED` 可能会在网络上不中断连接的情况下发生更改。因此,应用必须侦听 `onCapabilitiesChanged()` 回调,以处理网络恢复到其计量状态(失去 `NET_CAPABILITY_TEMPORARILY_NOT_METERED` 功能)的情况。

  • 一个网络不能同时拥有 `NET_CAPABILITY_NOT_METERED` 和 `NET_CAPABILITY_TEMPORARILY_NOT_METERED`。

5G 检测

从 Android 11 开始,您可以使用基于回调的 API 调用检测设备是否连接到 5G 网络。您可以检查连接是 5G NR(独立组网)还是 NSA(非独立组网)网络。

此 API 调用的一些用途可能包括:

  • 在您的应用中显示 5G 品牌,以突出您正在提供独特的 5G 体验。

  • 仅当在 5G 网络上时,才在应用中激活独特的 5G 体验。您应该将此状态检查与计量性检查结合使用。

  • 出于分析目的跟踪 5G 连接。

要在没有 5G 设备的情况下测试 5G 检测,您可以使用添加到 Android SDK 模拟器的功能。

检测 5G

调用 `TelephonyManager.listen()`,并传入 `LISTEN_DISPLAY_INFO_CHANGED`,以确定用户是否拥有 5G 网络连接。替换 `onDisplayInfoChanged()` 方法以确定用于显示目的的网络类型。一个例外是,如果运营商选择将 5G 显示为其毫米波网络的 RAT,则会返回 `OVERRIDE_NETWORK_TYPE_NR_NSA`。

下表显示了与这些值对应的网络:

返回类型 网络
OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO 高级专业 LTE (5Ge)
OVERRIDE_NETWORK_TYPE_NR_NSA 适用于 5G Sub-6 网络的 NR (5G)
OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE 适用于 5G 毫米波网络的 (5G+/5G UW)

带宽估算

带宽估算使用您在确定计量性时使用的 `NetworkCapabilities` 对象。您可以使用该对象获取带宽估算。

由于对框架支持的升级以及平台/调制解调器错误修复以适应 5G,Android 11 中带宽估算方法 `getLinkDownstreamBandwidthKbps()` 和 `getLinkUpstreamBandwidthKbps()` 的可靠性和准确性得到了提高。

带宽默认值仅提供应用启动时的指导。这应该有助于您处理“空闲时启动”场景。您的应用应在用户开始使用应用后测量其看到的内容,并动态调整其流式传输行为。例如,您可以根据启动时的带宽估算选择要提供的视频分辨率。在用户使用应用时继续检查估算值;随着连接类型和强度的变化,相应地调整您的应用行为。