Android 信号格客制化问题处理
[Android?Q]
信號強度客制化代碼位置:
| NR(5G) | CellSignalStrengthNr.java updateLevel() |
| LTE | MtkSignalStrength.java?updateMtkLteLevel() |
| WCDMA/UMTS | CellSignalStrengthWcdma.java updateLevel() |
| TDSCDMA | CellSignalStrengthTdscdma.java updateLevel() |
| GSM | CellSignalStrengthGsm.java updateLevel() |
| CDMA | CellSignalStrengthCdma.java updateLevel() |
?
[信號上報過程簡介]
modem底層信號數據 → modem L4中轉化為Asu并上報信號強度dbm值 → 在AP端將Asu或dbm值映射成信號格數從底層物理信號參數,到上層信號格顯示的流程大致是:
Asu與信號強度的對應關系由modem L4決定,此部分的代碼建議不要做任何的修改。
?
[信號強度AT命令格式說明]
Modem上報信號強度的格式:
3G modem:
+ECSQ: <asu>, <ber>, <rssi> (2G網絡)
+ECSQ: <asu>, <ber>, <rssi>, <rscp>, <ec/no> (3G網絡)
4G modem:
+ECSQ: <asu>, <ber>, <rssi>, <rscp>,1,1,1,<act> (2G網絡)
+ECSQ: <asu>, <ber>, <rssi>, <rscp>, <ec/no>,1,1, <act> (3G網絡)
+ECSQ: <rsrq>, <rsrp>,1,1,1,<rsrq_qdbm >,<rsrp_qdbm> <act> (4G網絡)
?
L版本、以及以后版本
NetworkControllerImpl.java (frameworks\base\packages\systemui\src\com\android\systemui\statusbar\policy)的updateTelephonySignalStrength()函數會根據獲取到的信號強度來設置狀態欄信號格的圖標。里面會執行mLastSignalLevel = iconLevel = mSignalStrength[slotId].getLevel(); 語句。
這個 getLevel() 函數定義在SignalStrength.java (frameworks\base\telephony\java\android\telephony)中,用于劃分信號格區間。在這個函數里面:
(1)LTE會執行 getLteLevel() 函數; getLteLevel()函數會執行 rsrpIconLevel = ssExt.mapLteSignalLevel(mLteRsrp, mLteRssnr, mLteSignalStrength);語句,并返回 rsrpIconLevel 的值,作為信號格圖標的level,即1格、2格之類。
(2)2G、3G會執行getGsmLevel()函數; getGsmLevel()函數會執行 level = ssExt.mapGsmSignalLevel(asu, mGsmRscpQdbm); 語句,并返回 level 的值,作為信號格圖標的level。
上面的 ssExt 對象涉及到當前項目配置的是OM版本、OP01版本等。 不同版本的實現有所不同。
請根據實際項目配置的版本,查看對應的代碼文件。
CMCC版本的代碼文件是:/vendor/mediatek/proprietary/operator/OP01/frameworks/packages/FwkPlugin/src/com/mediatek/op/telephony/ServiceStateExtOP01.java
CU版本的代碼文件是:/vendor/mediatek/proprietary/operator/OP02/frameworks/packages/FwkPlugin/src/com/mediatek/op/telephony/ServiceStateExtOP02.java
Open market版本的代碼文件是: /vendor/mediatek/proprietary/frameworks/base/packages/FwkPlugin/src/com/mediatek/op/telephony/DefaultServiceStateExt.java
?
JB/JB2/JB3/JB5/KK1MP1
1、?信號的物理參數會通過AT+ECSQ上報給AP端,格式為:
AT< +ECSQ: <asu>, <ber>, <rssi>????(2G網絡)
AT< +ECSQ: <asu>, <ber>, <rssi>, <rscp>, <ec/no>?????(3G網絡)
其中<rssi>, <rscp>, <ec/no>這幾個物理參數上報時單位為qdbm,換算為dbm的公式為:dbm=qdbm/4
?
2、SignalStrength.java中使用IServiceStateExt作為不同運營商客制化的接口。
???對于普通版本:IServiceStateExt的實現為ServiceStateExt.java
???對于中國移動(OP01)版本:IServiceStateExt的實現為ServiceStateExtOP01.java
步驟1:請修改ServiceStateExtXXX.java中的mapGsmSignalDbm(int GsmRscpQdbm,int asu)接口為以下形式,以方便我們接下來的客制化。
????public int mapGsmSignalDbm(int GsmRscpQdbm,int asu){
????????int dBm;
?//mtk add (這部分在KK版本中已經包含)
????????if(mGsmRscpQdbm?< 0 &&?mGsmRscpQdbm?! = -1)
????????????dBm = GsmRscpQdbm / 4; // Return raw value for 3G network.
????????else
//mtk add end
????????????dBm = -113 + (2 * asu);? ?
????????return dBm;
????}
?
???KK1MP3--4G(mtk 對4G部分只使用到了Rsrp的部分來計算信號強度)
?
mapLteSignalLevel(int mLteRsrp, int mLteRssnr, int mLteSignalStrength){
??? ......
??? if(mLteRsrp > -44) rsrpIconLevel = -1;
??? else if(mLteRsrp >= -85) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_GREAT;
??? else if(mLteRsrp >= -95) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_GOOD;
??? else if(mLteRsrp >= -105) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_MODERATE;
??? else if(mLteRsrp >= -115) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_POOR;
??? else if(mLteRsrp >= -140) rsrpIconLevel = signalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
?
????步驟2:SignalStrength.java中修改getGsmLevel():
????public int getGsmLevel() {
????????int level;
?
????????// 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.
????????int asu = getGsmSignalStrength();
????????int dBm = getGsmDbm();???//mtk add
????????boolean is3G = (mGsmRscpQdbm?< 0 &&?mGsmRscpQdbm?! = -1) ??true : false;????//mtk add (這部分在KK版本中已經包含)
?
????????try{
//mtk add (這部分在KK版本中已經包含)
????????????//level = mServiceStateExt.mapGsmSignalLevel(asu);
????????????level = mServiceStateExt.mapGsmSignalLevel(is3G, dBm, asu);
//mtk add end
????????} catch (Exception e){
????????????if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
????????????else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT;
????????????else if (asu >= 8)??level = SIGNAL_STRENGTH_GOOD;
????????????else if (asu >= 5)??level = SIGNAL_STRENGTH_MODERATE;
????????????else level = SIGNAL_STRENGTH_POOR;
????????}
????????if (DBG) log("getGsmLevel=" + level);
????????return level;
????}
?
步驟3:在ServiceStateExtXXX.java中添加mapGsmSignalLevel (boolean is3G, int?dBm,int asu),做信號格mapping:
a.區分3G網絡與2G網絡
可以通過判斷函數參數is3G是否是3G網絡,若是3G網絡的話為true,反之則是2G網絡。
b.使用asu與icon level來匹配
利用傳入的asu參數,根據自己信號格標準修改代碼。
c.使用dbm與icon level來匹配
利用傳入的dBm參數,根據自己信號格標準修改代碼。
????Example:使用asu作為參數計算WCDMA/GSM信號
?
總結
以上是生活随笔為你收集整理的Android 信号格客制化问题处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性代数张宇1000题 第六章 向量组
- 下一篇: GameKlip连接器: Android