【Settings】获取 SIM 卡信号强度 dBm 和 ASU

一、需求描述

运营商的设备管理应用,需要定时上报设备的信号强度,单位是 dBm(分贝毫瓦)

二、需求分析

参考设置中关于设备 - SIM 状态对话框 - 信号强度的实现方式

Settings/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java

java 复制代码
private void updateSignalStrength(SignalStrength signalStrength) {
        if (signalStrength == null) {
            return;
        }
        // by default we show the signal strength
        boolean showSignalStrength = true;
        if (mSubscriptionInfo != null) {
            final int subscriptionId = mSubscriptionInfo.getSubscriptionId();
            final PersistableBundle carrierConfig =
                    mCarrierConfigManager.getConfigForSubId(subscriptionId);
            if (carrierConfig != null) {
                showSignalStrength = carrierConfig.getBoolean(
                        CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL);
            }
        }
        if (!showSignalStrength) {
            mDialog.removeSettingFromScreen(SIGNAL_STRENGTH_LABEL_ID);
            mDialog.removeSettingFromScreen(SIGNAL_STRENGTH_VALUE_ID);
            return;
        }

        ServiceState serviceState = getTelephonyManager().getServiceState();
        if (!Utils.isInService(serviceState)) {
            return;
        }

        int signalDbm = getDbm(signalStrength);
        int signalAsu = getAsuLevel(signalStrength);

        if (signalDbm == -1) {
            signalDbm = 0;
        }

        if (signalAsu == -1) {
            signalAsu = 0;
        }

        /** SR.599.001006.003160 @{*/
        if (mSubscriptionInfo != null) {
            boolean isInNsa = false;
            int signalNrDbm = 0;
            int signalNrAsu = 0;

            if (mTelephonyDisplayInfo != null) {
                if (mTelephonyDisplayInfo.getOverrideNetworkType()
                        == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA) {
                    isInNsa = true;
                    for (CellSignalStrengthNr cellNr :
                            signalStrength.getCellSignalStrengths(CellSignalStrengthNr.class)) {
                        signalNrDbm = cellNr.getDbm();
                        signalNrAsu = cellNr.getAsuLevel();
                    }
                    if (signalNrDbm == Integer.MAX_VALUE) {
                        signalNrDbm = 0;
                        signalNrAsu = 0;
                    }
                    Log.d(TAG, "updateSignalStrength signalNrDbm : " + signalNrDbm + " signalNrAsu: "
                            + signalNrAsu);
                }
            }

            if (isInNsa) {
                mDialog.setText(SIGNAL_STRENGTH_VALUE_ID, "LTE: " +
                    mRes.getString(R.string.sim_signal_strength,
                        signalDbm, signalAsu) + (isInNsa ? ("\n NR: " + mRes.getString
                            (R.string.sim_signal_strength,
                        signalNrDbm, signalNrAsu)) : ""));
            } else {
                mDialog.setText(SIGNAL_STRENGTH_VALUE_ID, mRes.getString(R.string.sim_signal_strength,
                        signalDbm, signalAsu));
            }
        }
    }

signalNrDbmsignalNrAsu 表示 5G 网络的信号强度

signalDbmsignalAsu 表示非 5G 网络的信号强度

三、解决方案

获取 TelephonyManager

java 复制代码
TelephonyManager mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);

通过 getSignalStrength 来解析,会区分 5G 网络和其他,单位是 dBm(分贝毫瓦) ,这里只获取了 dBm 作为参考

java 复制代码
public int getCsq() {
    int dbm = 0;
    SignalStrength signalStrength = mTelephonyManager.getSignalStrength();
    if (signalStrength != null) {
        if (mTelephonyManager.getDataNetworkType() == TelephonyManager.NETWORK_TYPE_NR) {
            int signalNrDbm = 0;
            for (CellSignalStrengthNr cellNr : signalStrength.getCellSignalStrengths(CellSignalStrengthNr.class)) {
                signalNrDbm = cellNr.getDbm();
            }
            return signalNrDbm;
        }
        List<CellSignalStrength> cellSignalStrengthList = signalStrength.getCellSignalStrengths();
        if (cellSignalStrengthList == null) {
            return dbm;
        }
        for (CellSignalStrength cell : cellSignalStrengthList) {
            if (cell.getDbm() != -1) {
                dbm = cell.getDbm();
                break;
            }
        }
    }
    return dbm;
}

四、关于 dBm 和 ASU

在移动通信(包括 Android 系统)中,dBmASU 是两种常用于表示手机信号强度的单位,它们含义不同,但可以相互换算。

1. dBm(Decibel-milliwatt)

  • 定义 :dBm 是一种绝对功率单位 ,表示相对于 1 毫瓦(mW)的对数功率值,计算公式为:

  • 特点

    • 信号强度通常为负值,因为接收到的信号远小于 1 mW。
    • 典型范围:-30 dBm(极强)到 -110 dBm(极弱)
    • -70 dBm 或更高(如 -60 dBm)通常表示良好信号
  • 用途:广泛用于工程和网络优化中,因为它直接反映信号的物理强度。

2. ASU(Arbitrary Strength Unit)

  • 定义 :ASU 是一个无量纲的整数单位 ,是手机内部对信号强度的相对度量,不同网络制式下定义不同 。

  • 特点

    • GSM 网络 :ASU 范围为 0--31,其中 99 表示未知;ASU = 99 通常意味着无服务。
    • UMTS(3G)网络 :ASU 表示 RSCP(Received Signal Code Power) ,范围 0--97
    • LTE/5G 网络 :ASU 通常基于 RSRP(Reference Signal Received Power)
  • 与 dBm 的换算关系(以 LTE 为例)

    例如:ASU = 30 → dBm = 2×30 − 113 = -53 dBm(极强信号)。

3. 对比总结

项目 dBm ASU
单位类型 绝对功率单位(物理量) 相对整数单位(设备内部表示)
数值范围 -30 ~ -110 dBm(典型) 0--31(GSM)、0--97(UMTS)等
是否负值
是否通用 是,跨平台通用 否,依赖网络制式和设备厂商
换算 可由 ASU 换算(依网络类型而定) 可由 dBm 反推
相关推荐
雨白5 小时前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk5 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING6 小时前
RN容器启动优化实践
android·react native
恋猫de小郭8 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker13 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴14 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭1 天前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab1 天前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe1 天前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农2 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos