Я использую CellInfo для захвата мощности сигнала и ARFCN / UARFCN / EARFCN каждую секунду.
Но, думаю, это не очень точно.Это всегда хуже -5 ~ -10 дБм, чем уровень сигнала, отображаемый в настройках телефона.Иногда я также получаю 0 или целое число. MAX_VALUE.Является ли мой код проблемой или есть какой-либо другой способ получить реальную мощность сигнала?
var cellInfoList: List<CellInfo> = mTelephonyManager.allCellInfo
if (cellInfoList.isNotEmpty()) {
for (cellInfo in cellInfoList) {
if (cellInfo is CellInfoLte) {
val cellSignalStrengthLte = cellInfo.cellSignalStrength
val cellIdentityLte = cellInfo.cellIdentity
var arfcn = cellIdentityLte.earfcn
intSignalStrength = cellSignalStrengthLte.dbm
networkStatus = "${Integer.toString(intSignalStrength)} dBm | $arfcn"
} else if (cellInfo is CellInfoGsm) {
val cellSignalStrengthGsm = cellInfo.cellSignalStrength
val cellIdentityGsm = cellInfo.cellIdentity
var arfcn = cellIdentityGsm.arfcn
intSignalStrength = cellSignalStrengthGsm.dbm
networkStatus = "${Integer.toString(intSignalStrength)} dBm | $arfcn"
} else if (cellInfo is CellInfoWcdma) {
val cellSignalStrengthWcdma = cellInfo.cellSignalStrength
val cellIdentityWcdma = cellInfo.cellIdentity
var arfcn = uarfcnToBand(cellIdentityWcdma.uarfcn)
intSignalStrength = cellSignalStrengthWcdma.dbm
networkStatus = "${Integer.toString(intSignalStrength)} dBm | $arfcn"
} else if (cellInfo is CellInfoCdma) {
val cellSignalStrengthCdma = cellInfo.cellSignalStrength
intSignalStrength = cellSignalStrengthCdma.dbm
networkStatus = "${Integer.toString(intSignalStrength)} dBm"
}
}
}