安卓,我怎样判断5G NSA或SA?

3
手机显示5G,但telephoneManager.getDataNetworkType显示为LTE。在设置中,SIM卡状态显示移动语音网络类型(翻译自中文,可能不正确)为NR NSA(非独立),但移动数据网络类型(翻译自中文)为LTE。
那么,我该如何判断5G NSA还是SA(独立)?
我是Android的新手,不擅长英语,哈哈哈...谢谢。 这是我在Stackoverflow上的第一个问题。
2个回答

2
如果您有一个Android 11设备,请参考以下链接: https://source.android.com/devices/tech/connect/acts-5g-testing https://developer.android.com/about/versions/11/features/5g#detection 自30.0.22版本以来,emulator也支持伪造5G网络连接: https://developer.android.com/about/versions/11/behavior-changes-all#emulator-5g
"TelephonyManager和TelephonyDisplayInfo两者都是必需的才能正确检测:SL4A使用以下值来区分5G的NSA(非独立)、毫米波(mmWave)和SA(独立)连接类型:"

类型
5G NSA TelephonyManager.getDataNetworkType() = LTE
TelephonyDisplayInfo.getNetworkType() = LTE
TelephonyDisplayInfo.getOverrideNetworkType() = NR_NSA
5G mmWave TelephonyDisplayInfo.getOverrideNetworkType() = NR_MMWAVE
5G SA TelephonyManager.getDataNetworkType() = NR
TelephonyDisplayInfo.getNetworkType() = NR

"TelephonyDisplayInfo.getOverrideNetworkType()可以用于区分4G LTE和5G NSA。在大多数地区,Android 11模拟器可能是实际测试的最佳机会。"

这并不是100%正确的。NR NSA与LTE不同,并且它并不总是使用与LTE完全相同的频段。Android支持已经在某些地区部署的NR SA。 - kingston
它使用相同的频段和共享具有相同频率的通道名称(只有通道不同 - 并且在SA中,还有另一个带有更独特通道的频段)。AOSP源代码可以确切地告诉我们它的支持情况 - 以及如何精确区分模式(传闻并不可靠)...我的担忧基于这样一个事实,即文档根本没有提到5G SA。 - Martin Zeitler
发布说明还提到:“Android 10增加了对5G非独立组网(NSA)的支持”...而在Android 11中,这似乎得到了更好的支持:https://source.android.com/devices/tech/connect/signal-strength - Martin Zeitler
5G新无线电使用这些频段,与4G LTE 频段相比。而Android 11很可能是必需的(请参见上面的URL)。 - Martin Zeitler
我同意。请注意,您引用的API目前即使在搭载Android 11的Pixel 5上也无法正常工作。它们返回LTE,即使您处于5G网络下,而且“TelephonyDisplayInfo”也不能正确报告该值。这可能会在以后得到改善。即使是cellInfo通常也不如您所期望的那样:例如有时使用的NR单元被报告为未使用。 - kingston
显示剩余2条评论

1
很遗憾,对于这些情况你不能依赖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,因为它不可靠。这些值向用户显示,并遵循运营商策略或品牌偏好。

NR 状态现在在 Android 12 中被屏蔽。 - Android
@Android 你是什么意思? - kingston
该值现在被隐藏在****后面,您无法从Android 12的ServiceState类中读取"nrState"。 - Android
@Android 你说得对。看起来 TelephonyCallback 和 TelephonyDisplayInfo 将是 Android 12 上唯一可用的选项。 - kingston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接