向您的应用添加 5G 功能

Android 11 添加了在您的应用中支持 5G 的功能。本主题介绍了该功能,并简要说明了向您的应用添加 5G 专用功能如何改善用户体验。

针对 5G 构建

在决定如何与 5G 互动时,思考一下您试图打造什么样的体验。5G 可通过一些方法增强您的应用,其中包括:

  • 由于 5G 在速度和延迟方面的改进,自动使当前的体验更快更好。
  • 提升用户体验,如通过显示 4k 视频或下载分辨率更高的游戏资产。
  • 在确认增加的流量消耗不会让用户付费后,添加通常仅通过 WLAN 提供的体验,如主动下载一般为不按流量计费的 WLAN 保留的内容。
  • 提供 5G 独有的体验,这种体验只能在高速度且低延迟的网络上实现。

5G 功能

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

检查按流量计费性

NET_CAPABILITY_TEMPORARILY_NOT_METERED 是 Android 11 中添加的一项功能,可根据移动网络运营商提供的信息,告知您正在使用的网络是否不按流量计费。

该新标记与 NET_CAPABILITY_NOT_METERED 一起使用。该现有标记指示网络是否始终不按流量计费,并且同时适用于 WLAN 和移动网络连接。

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

一旦确定当前网络暂时或永久不按流量计费,您便可以显示分辨率更高的内容(如 4k 视频)、上传日志、备份文件,以及主动下载内容。

下面几部分介绍了向您的应用添加按流量计费性检查的步骤。

注册网络回调

使用 ConnectivityManager.registerDefaultNetworkCallback() 注册一个网络回调,以监听 NetworkCapabilities 何时发生更改。您可以通过替换 NetworkCallback 中的 onCapabilitiesChanged() 方法来检测 NetworkCapabilities 的更改。

registerDefaultNetworkCallback() 会使注册的回调在注册后立即触发,从而为应用提供有关当前状态的信息。将来的回调对于应用在状态从不按流量计费更改为按流量计费或者从按流量计费更改为不按流量计费时采取适当的措施至关重要。

检查按流量计费性

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

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_METEREDNET_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 显示为其 mmWave 网络的 RAT,则会返回 OVERRIDE_NETWORK_TYPE_NR_NSA

下表显示了与这些值对应的影音平台:

返回类型 网络
OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO 高级专业版 LTE (5Ge)
OVERRIDE_NETWORK_TYPE_NR_NSA NR (5G) - 5G Sub-6 网络
OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE 5G+/5G UW - 5G mmWave 网络

带宽估测

带宽估测使用您在确定按流量计费性时使用的 NetworkCapabilities 对象。您可以使用该对象获取带宽估测值。

带宽估测方法 getLinkDownstreamBandwidthKbps()getLinkUpstreamBandwidthKbps() 的可靠性和准确性在 Android 11 中得到了改进,这是因为,为了适应 5G 而进行了框架支持的升级和平台/调制解调器问题修复。

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