很遗憾,对于这些情况你不能依赖APIs。
我找到的唯一方法是注册一个监听器来从TelephonyManager获取ServiceState,然后解析serviceState.toString()的结果。
telephonyManager.listen(object : PhoneStateListener() {
override fun onServiceStateChanged(state: ServiceState) {
val serviceState = state.toString()
val nr = serviceState.isNrAvailable()
...
}
}, PhoneStateListener.LISTEN_SERVICE_STATE)
fun String.isNrAvailable() =
contains("nrState=CONNECTED") ||
contains("nsaState=5"))
这通常能为你提供正确的答案,顺便说一下,
NR NSA
是 NR non-standalone 的正确名称。
如果你想区分 NRSA 和 NRNSA,你需要从 TelephonyManager 获取所有的 cellInfo。
telephonyManager.allCellInfo
检查主要单元是否为NR。
cellInfo.cellConnectionStatus
在某些情况下,您会发现没有NR单元。在这种情况下,您可以确定连接是NRNSA(假设它是5G)。
在其他情况下,会有NR单元,但它们不会被报告为主单元。即使使用了NR单元,设备也可能将其报告为未连接。同样,在这种情况下,您知道它是NRNSA。
您可以通过检查信号强度来检测使用的NR单元,即使它被报告为未连接。
cellInfo.cellSignalStrength.dbm
您会发现报告的信号强度与具有最高SS-RSRP(同步信号参考信号接收功率)的NR小区的强度相同。
我建议避免使用TelephonyDisplayInfo,因为它不可靠。这些值向用户显示,并遵循运营商策略或品牌偏好。