android介面UI訊號顯示是通過RIL對通訊模組發送AT命令來實現的,如AT+CSQ,我們查看一般可以通過 logcat -b radio來擷取一些RIL的即時資訊
那麼訊號顯示隔多長時間在在介面上重新整理?
frameworks/base/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
/** Signal strength poll rate. */
protected static final int POLL_PERIOD_MILLIS = 120 * 1000;
它的訊號重新整理時間為2分鐘,也就是說從我開機到訊號顯示大概需要2分鐘的時間,這顯示太長了
protected static final int POLL_PERIOD_MILLIS = 12 * 1000;
我們可以將其改為12秒
那麼訊號在介面上的顯示的訊號強度又是 如何擷取的呢?
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarPolicy.java
if (!isCdma()) { //GSM訊號強度的擷取
int asu = mSignalStrength.getGsmSignalStrength();
// ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
// asu = 0 (-113dB or less) is very weak
// signal, its better to show 0 bars to the user in such cases.
// asu = 99 is a special case, where the signal strength is unknown.
if (asu <= 2 || asu == 99) iconLevel = 0;
else if (asu >= 12) iconLevel = 4;
else if (asu >= 8) iconLevel = 3;
else if (asu >= 5) iconLevel = 2;
else iconLevel = 1;
// Though mPhone is a Manager, this call is not an IPC
if (mPhone.isNetworkRoaming()) {
iconList = sSignalImages_r[mInetCondition];
} else {
iconList = sSignalImages[mInetCondition];
}
} else {
iconList = sSignalImages[mInetCondition];
// If 3G(EV) and 1x network are available than 3G should be //當有3G和1X(電信2.5G)網路的時候會顯示EVDO網路
// displayed, displayed RSSI should be from the EV side.
// If a voice call is made then RSSI should switch to 1x. //打電話的時候走的是1X網路,
if ((mPhoneState == TelephonyManager.CALL_STATE_IDLE) && isEvdo()){
iconLevel = getEvdoLevel();
if (false) {
Slog.d(TAG, "use Evdo level=" + iconLevel + " to replace Cdma Level=" + getCdmaLevel());
}
} else {
iconLevel = getCdmaLevel();
}
}
mPhoneSignalIconId = iconList[iconLevel];
mService.setIcon("phone_signal", mPhoneSignalIconId, 0);
}
private int getCdmaLevel() { //CDMA訊號顯示
final int cdmaDbm = mSignalStrength.getCdmaDbm();
final int cdmaEcio = mSignalStrength.getCdmaEcio();
int levelDbm = 0;
int levelEcio = 0;
if (cdmaDbm >= -75) levelDbm = 4;
else if (cdmaDbm >= -85) levelDbm = 3;
else if (cdmaDbm >= -95) levelDbm = 2;
else if (cdmaDbm >= -100) levelDbm = 1;
else levelDbm = 0;
// Ec/Io are in dB*10
if (cdmaEcio >= -90) levelEcio = 4;
else if (cdmaEcio >= -110) levelEcio = 3;
else if (cdmaEcio >= -130) levelEcio = 2;
else if (cdmaEcio >= -150) levelEcio = 1;
else levelEcio = 0;
return (levelDbm < levelEcio) ? levelDbm : levelEcio;
}
private int getEvdoLevel() { //EVDO網路顯示 CDMA2000 3G訊號顯示(例如電信天翼3G)
int evdoDbm = mSignalStrength.getEvdoDbm();
int evdoSnr = mSignalStrength.getEvdoSnr();
int levelEvdoDbm = 0;
int levelEvdoSnr = 0;
if (evdoDbm >= -65) levelEvdoDbm = 4;
else if (evdoDbm >= -75) levelEvdoDbm = 3;
else if (evdoDbm >= -90) levelEvdoDbm = 2;
else if (evdoDbm >= -105) levelEvdoDbm = 1;
else levelEvdoDbm = 0;
if (evdoSnr >= 7) levelEvdoSnr = 4;
else if (evdoSnr >= 5) levelEvdoSnr = 3;
else if (evdoSnr >= 3) levelEvdoSnr = 2;
else if (evdoSnr >= 1) levelEvdoSnr = 1;
else levelEvdoSnr = 0;
return (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr;
}
很多android手機訊號並非很好,他們可以通過修改上面一段讓介面顯示的訊號維持在某個地區內,當然每個模組的訊號取值 RSSI值並不是全部遵循上面這段代碼的分級標準,需對應相應的AT手冊進行修改。