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来说还是依据仪器或者日志查看靠谱。