“SIM卡状态”中的dBm和状态栏的信号格数是对应的吗?

Android手机设置中最后一项一般都是“关于手机”,在这个项目中可以找到查看sim卡状态的子页面。


其中可以查看信号强度,测试人员可以依据dBm和状态栏的信号格数大致确认两者之间的关系。

这个大部分情况下是ok的,不过对于Cdma网络来说这个就有可能出问题了。截图中的状态栏信号格数是双行的,这个是Cdma的特点,1X信号和EVDO信号同时注册的,1x用来语音通话,EVDO就和其名称一样(Evolution Data Only)是用于数据业务的。但是状态栏可以不显示双行啊,苹果的电信版本手机就只会显示一行。在Cdma网络中,这个设置中显示的Dbm和状态栏就不一定是对应的关系了。

截图中Activity的代码在设置中,packages/apps/Settings/src/com/android/settings/RadioInfo.java

    private final void updateSignalStrength() {
        ...

        int signalDbm = mPhoneStateReceiver.getSignalStrengthDbm();

        ...
    }

其中的mPhoneStateReceiver就是frameworks/opt/telephony/src/java/com/android/internal/telephony/PhoneStateIntentReceiver.java

    public int getSignalStrengthDbm() {
        if ((mWants & NOTIF_SIGNAL) == 0) {
            throw new RuntimeException
                ("client must call notifySignalStrength(int)");
        }
        return mSignalStrength.getDbm();
    }
frameworks/base/telephony/java/android/telephony/SignalStrength.java

    public int getDbm() {
        int dBm;

        if(isGsm()) {
            dBm = getLteDbm();
            if (dBm == INVALID) {
                dBm = getGsmDbm();
            }
        } else {
            int cdmaDbm = getCdmaDbm();
            int evdoDbm = getEvdoDbm();

            return (evdoDbm == -120) ? cdmaDbm : ((cdmaDbm == -120) ? evdoDbm
                    : (cdmaDbm < evdoDbm ? cdmaDbm : evdoDbm));
        }
        if (DBG) {
            log("getDbm=" + dBm);
        }
        return dBm;
    }
从代码中看出cdma网络下是选择1x信号和evdo信号中的最小值作为输出。

状态栏中的格数代码同样在SignalStrength.java中

    public int getLevel() {
   	
  	    	
        int level;

        if (isGsm) {
            level = getLteLevel();
            if (level == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
                level = getGsmLevel();
            }
        } else {
            int cdmaLevel = getCdmaLevel();
            int evdoLevel = getEvdoLevel();
            if (evdoLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
                /* We don't know evdo, use cdma */
                level = cdmaLevel;
            } else if (cdmaLevel == SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
                /* We don't know cdma, use evdo */
                level = evdoLevel;
            } else {
                /* We know both, use the lowest level */
                level = cdmaLevel < evdoLevel ? cdmaLevel : evdoLevel;
            }
            //log("lq_signal getLevel() cdmaLevel = " + cdmaLevel + "; evdoLevel = " + evdoLevel + "; level = " + level);
        }
        if (DBG) {
            log("getLevel=" + level);
        }
        return level;
    }

信号格数同样是选取evdo和1x信号格数的最小值做为输出。1x信号在大于-90dBm就是满格了(cdma的特点,依据编码的正交来区别用户,对载波要求很低,相邻基站可以是同频率的载波),而evdo在大于-65dbm才能满格。

这样设置中显示的dBm就可能是1x,也可能是evdo;状态栏信号格数也是同样的状况。两者不一致的情况发生可能性很大。

对于cdma来说还是依据仪器或者日志查看靠谱。




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值