You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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个关键问题:

  1. 属性名大小写错误
    Kotlin遵循小驼峰命名规范,Android SDK中CellIdentityNr的小区标识属性是小写开头的nci,而非大写开头的Nci,直接调用Nci会导致编译或运行时错误。

  2. 信号参数映射错误
    你用asuLevel填充RSRP字段是错误的,CellSignalStrengthNr提供了专门的rsrp()方法获取5G的参考信号接收功率,应该替换为cellSignalStrengthNr.rsrp.toString()。

  3. 缺少必要参数
    和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:06:56