API 29环境下5G(Nr)CellIdentityNr/CellSignalNr参数获取失败排查
5G(NR)蜂窝网络参数获取失败问题排查
我曾通过相关命令在3G、4G环境中成功获取所需的蜂窝网络参数,但在5G(Nr)环境下该方法失效,API版本已更新至29。相关代码如下:
private fun getCellInfo(cellInfo: CellInfo): HashMap<Any?, String?> { var netclass = getNetworkClass() Log.d("MyActivity", netclass) var map = hashMapOf<Any?, String?>() if (cellInfo is CellInfoGsm) { val cellIdentityGsm = cellInfo.cellIdentity val cellSignalGsm = cellInfo.cellSignalStrength map["cell_identity"] = cellIdentityGsm.cid.toString() map["MCC"] = cellIdentityGsm.mcc.toString() map["MNC"] = cellIdentityGsm.mnc.toString() map["LAC"] = cellIdentityGsm.lac.toString() map["RSSI"] = cellSignalGsm.dbm.toString() map["RxLev"] = cellSignalGsm.asuLevel.toString() map["Level_of_strength"] = cellSignalGsm.level.toString() map["type"] = "2" } else if (cellInfo is CellInfoLte) { val cellIdentityLte = cellInfo.cellIdentity val cellSignalStrengthLte = cellInfo.cellSignalStrength map["cell_identity"] = cellIdentityLte.ci.toString() map["MCC"] = cellIdentityLte.mcc.toString() map["MNC"] = cellIdentityLte.mnc.toString() map["TAC"] = cellIdentityLte.tac.toString() map["RSRP"] = cellSignalStrengthLte.rsrp.toString() map["RSRQ"] = cellSignalStrengthLte.rsrq.toString() map["Level_of_strength"] = cellSignalStrengthLte.level.toString() map["type"] = "4" } else if (cellInfo is CellInfoWcdma) { val cellIdentityWcdma = cellInfo.cellIdentity val cellSignalWcdma = cellInfo.cellSignalStrength map["cell_identity"] = cellIdentityWcdma.cid.toString() map["MCC"] = cellIdentityWcdma.mcc.toString() map["MNC"] = cellIdentityWcdma.mnc.toString() map["LAC"] = cellIdentityWcdma.lac.toString() map["RSCP"] = cellSignalWcdma.dbm.toString() map["Level_of_strength"] = cellSignalWcdma.level.toString() map["type"] = "3" } else if (cellInfo is CellInfoNr) { val cellIdentityNr = cellInfo.cellIdentity val cellSignalStrengthNr = cellInfo.cellSignalStrength map["cell_identity"] = cellIdentityNr.Nci.toString() //wrong here map["RSRP"] = cellSignalStrengthNr.asuLevel.toString() } map["net_type"] = netclass map["plmn"] = tm.getNetworkOperator().toString() return map }
问题分析与修正
你的5G参数获取逻辑存在3个关键问题:
属性名大小写错误
Kotlin遵循小驼峰命名规范,Android SDK中CellIdentityNr的小区标识属性是小写开头的nci,而非大写开头的Nci,直接调用Nci会导致编译或运行时错误。信号参数映射错误
你用asuLevel填充RSRP字段是错误的,CellSignalStrengthNr提供了专门的rsrp()方法获取5G的参考信号接收功率,应该替换为cellSignalStrengthNr.rsrp.toString()。缺少必要参数
和3G/4G的参数逻辑对齐,5G分支还需要补充MCC、MNC、N-TAC(对应cellIdentityNr.tac)、网络类型标识type="5",以及信号强度等级level,否则返回的参数不完整。
修正后的5G分支代码
else if (cellInfo is CellInfoNr) { val cellIdentityNr = cellInfo.cellIdentity val cellSignalStrengthNr = cellInfo.cellSignalStrength map["cell_identity"] = cellIdentityNr.nci.toString() map["MCC"] = cellIdentityNr.mcc.toString() map["MNC"] = cellIdentityNr.mnc.toString() map["TAC"] = cellIdentityNr.tac.toString() // 5G的TAC字段 map["RSRP"] = cellSignalStrengthNr.rsrp.toString() map["Level_of_strength"] = cellSignalStrengthNr.level.toString() map["type"] = "5" // 标记为5G网络类型 }
内容的提问来源于stack exchange,提问作者YYY RAY
相关产品推荐
相关产品推荐

