編輯:關於Android編程
在修改顯示的信號強度之前,先了解一下什麼是dB,什麼是dBm?
1.dB
dB是一個表征相對值的值,純粹的比值,只表示兩個量的相對大小關系,沒有單位,當考慮甲的功率相比於乙功率大或小多少個dB時,
按下面的計算公式:10log(甲功率/乙功率),如果采用兩者的電壓比計算,要用20log(甲電壓/乙電壓)。)
[例] 甲功率比乙功率大一倍,那麼10lg(甲功率/乙功率)=10lg2=3dB。也就是說,甲的功率比乙的功率大3 dB。
反之,如果甲的功率是乙的功率的一半,則甲的功率比乙的功率小3 dB。
2.dBm
dBm是一個表示功率絕對值的值(也可以認為是以1mW功率為基准的一個比值),計算公式為:10log(功率值/1mw)。
[例] 如果功率P為1mw,折算為dBm後為0dBm。
[例] 對於40W的功率,按dBm單位進行折算後的值應為:
10log(40W/1mw)=10log(40000)=10log4+10log10000=46dBm。
總之,dB是兩個量之間的比值,表示兩個量間的相對大小,而dBm則是表示功率絕對大小的值。在dB,dBm計算中,要注意基本概念,
用一個dBm減另外一個dBm時,得到的結果是dB,如:30dBm - 0dBm = 30dB。
3.手機信號強度表示
好了,那麼手機上顯示的數字的單位是那個呢,是dBm。當你仔細看的時候會發現這個值是負的,也就是說手機會顯示比如 -67(dBm),那就說明信號很強了.
這裡還說一個小知識:
中國移動的規范規定,手機接收電平>=(城市取-90dBm ;鄉村取 -94dBm )時,則滿足覆蓋要求,也就是說此處無線信號強度滿足覆蓋要求。
-67dBm 要比-90dBm 信號要強20多個dB ,那麼它在打電話接通成功率和通話過程中的話音質量都會好的多(當然也包括EDGE/GPRS上網的速度那些 )
所以,那個值越大信號就越好,因為那是個負值,而且在你手裡的時候它永遠是負值 ,如果你感
興趣且附近有無線基站的天線的話,你也可以把你的手機盡量接近天線面板,那麼值就越來越大,如果手機跟天線面板挨到一起,
那麼它可能十分接近於0了(0是達不到的,這裡的0的意思也不是說手機沒信號了。)
在信號強度計選擇工程模式,顯示了很多參數,你只要看BCCHLev(控制信道電平值)它就是手機的信號強度值,單位dBm,多大的信號你的手機可以正常接聽呢,BCCHLev-C1,C1也有顯示數值,如:BCCHLev(-63) ,C1(34),表示你的手機在信號大於-97dBm的狀況下是不會掉話的。
再來看手機發射功率要多大才合適呢,按GSM協議規定,手機發射功率是可以被基站控制的。基站通過下行SACCH信道,發出命令控制手機的發射功率級別,
每個功率級別差2dB;
GSM900 手機最大發射功率級別是5(2W=2000mw,33dBm),最小發射功率級別是19(3mw,5dBm),
DCS1800手機最大發射功率級別是0(1W,30dBm),最小發射功率級別是15(1mW,0dBm)。
當手機遠離基站,或者處於無線陰影區時,基站可以命令手機發出較大功率,直至33dBm(GSM900),
以克服遠距離傳輸或建築物遮擋所造成的信號損耗。
強度計裡的TXPower就是手機發射功率,你在撥打電話的狀態下可以看出你的手機發射功率,也就是數值越大越省電,輻射越小,數值在5,
你的電話耗電大電池用不了一天,通話時別人經常聽不到你的聲音,你的手機經常會突然沒信號,會掉話,這樣你可以打投訴電話讓運營商來做信號覆蓋,
讓你的手機信號好起來,減少輻射。
以上那麼多字,只有一個核心意思。不要被你手機信號還有多少格欺騙!!!那都是手機廠商自己定義的。咱要玩專業點的,直接看信號強度dBm。
android系統查信號強度在設置—關於手機—網絡裡。
室內和室外的信號強度是有差距的。一般室外信號比室內好。
現在來看這個所謂的dBm,數值范圍在-XX~0之間。這個數越大,信號強度越高。
-50dBm~0dBm范圍內,恭喜你,你的信號已經好得很了。話說你就站在基站旁邊是吧,哈
-90dBm~-60dBm,同樣恭喜你,你基本不會面臨打不了電話的問題。如果打不了的,找運營商吧,那是他們的問題。
G室內,DS放桌上信號強度-67dBm,23asu。作打電話狀握手裡,-75dBm,19asu。調整各種姿勢,看到的最低是-83dBm,15asu。
這屬於什麼等級呢?簡單說就是,信號很不錯。室外沒看,但肯定比這個高,
至於其他手機,可以自己上網去看,和DS的dBm值大多在一個檔次。個別帖子炫耀自己大於-50dBm的,都是因為他就在基站邊上。正常的范圍是-90dBm~-60dBm。
====================================================================================
下面我們來看看手機沒有修改時候的顯示效果,關於手機-->狀態信息-->SIM卡狀態-->信號強度,就能看到手機的信號強度了。如下圖所示:
1、當信號大於等於-85dBm時候,信號顯示滿格
2、當信號大於等於-95dBm時候,而小於-85dBm時,信號顯示3格
3、當信號大於等於-105dBm時候,而小於-95dBm時,信號顯示2格,不好捕捉到。
4、當信號大於等於-115dBm時候,而小於-105dBm時,信號顯示1格,不好捕捉到。
5、當信號大於等於-140dBm時候,而小於-115dBm時,信號顯示0格,不好捕捉到。
上面幾個等級的相應劃分的源代碼在:rameworks/base/telephony/java/android/telephony/SignalStrength.java
中的getLteLevel()方法中,代碼1如下:
/** * Get LTE as level 0..4 * * @hide */ public int getLteLevel() { /* * TS 36.214 Physical Layer Section 5.1.3 TS 36.331 RRC RSSI = received * signal + noise RSRP = reference signal dBm RSRQ = quality of signal * dB= Number of Resource blocksxRSRP/RSSI SNR = gain=signal/noise ratio * = -10log P1/P2 dB */ int rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; int rsrpIconLevel = -1; int snrIconLevel = -1; int rsrpThreshType = Resources.getSystem().getInteger(com.android.internal.R.integer. config_LTE_RSRP_threshold_type); int[] threshRsrp; if (rsrpThreshType == RSRP_THRESH_TYPE_STRICT) { threshRsrp = RSRP_THRESH_STRICT; } else { threshRsrp = RSRP_THRESH_LENIENT; } //[ALPS01440836][ALPS01594704]-START: change level mapping rule of signal for CMCC if (!IS_BSP_PACKAGE) { IServiceStateExt ssExt = getPlugInInstance(); if (ssExt != null) { rsrpIconLevel = ssExt.mapLteSignalLevel(mLteRsrp, mLteRssnr, mLteSignalStrength); //added by ouyang android.util.Log.e(oyp, ssExt != null, rsrpIconLevel:+ rsrpIconLevel); return rsrpIconLevel; } else { log([getLteLevel] null plug-in instance); } } //modifed by ouyang [2015-10-12] start // if (mLteRsrp > -44) { // rsrpIconLevel = -1; // } else if (mLteRsrp >= -85) { // rsrpIconLevel = SIGNAL_STRENGTH_GREAT; // } else if (mLteRsrp >= -95) { // rsrpIconLevel = SIGNAL_STRENGTH_GOOD; // } else if (mLteRsrp >= -105) { // rsrpIconLevel = SIGNAL_STRENGTH_MODERATE; // } else if (mLteRsrp >= -115) { // rsrpIconLevel = SIGNAL_STRENGTH_POOR; // } else if (mLteRsrp >= -140) { // rsrpIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; // } if (mLteRsrp > -44) { rsrpIconLevel = -1; } else if (mLteRsrp >= -97) { rsrpIconLevel = SIGNAL_STRENGTH_GREAT; } else if (mLteRsrp >= -105) { rsrpIconLevel = SIGNAL_STRENGTH_GOOD; } else if (mLteRsrp >= -110) { rsrpIconLevel = SIGNAL_STRENGTH_MODERATE; } else if (mLteRsrp >= -120) { rsrpIconLevel = SIGNAL_STRENGTH_POOR; } else if (mLteRsrp >= -140) { rsrpIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } //modifed by ouyang [2015-10-12] end //added by ouyang android.util.Log.e(oyp, getLTELevel - rsrp: + mLteRsrp + rsrpIconLevel: + rsrpIconLevel); /* * Values are -200 dB to +300 (SNR*10dB) RS_SNR >= 13.0 dB =>4 bars 4.5 * dB <= RS_SNR < 13.0 dB => 3 bars 1.0 dB <= RS_SNR < 4.5 dB => 2 bars * -3.0 dB <= RS_SNR < 1.0 dB 1 bar RS_SNR < -3.0 dB/No Service Antenna * Icon Only */ if (mLteRssnr > 300) { snrIconLevel = -1; } else if (mLteRssnr >= 130) { snrIconLevel = SIGNAL_STRENGTH_GREAT; } else if (mLteRssnr >= 45) { snrIconLevel = SIGNAL_STRENGTH_GOOD; } else if (mLteRssnr >= 10) { snrIconLevel = SIGNAL_STRENGTH_MODERATE; } else if (mLteRssnr >= -30) { snrIconLevel = SIGNAL_STRENGTH_POOR; } else if (mLteRssnr >= -200) { snrIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } //added by ouyang android.util.Log.e(oyp, getLTELevel - snr: + mLteRssnr + snrIconLevel: + snrIconLevel); if (DBG) log(getLTELevel - rsrp: + mLteRsrp + snr: + mLteRssnr + rsrpIconLevel: + rsrpIconLevel + snrIconLevel: + snrIconLevel); /* Choose a measurement type to use for notification */ if (snrIconLevel != -1 && rsrpIconLevel != -1) { /* * The number of bars displayed shall be the smaller of the bars * associated with LTE RSRP and the bars associated with the LTE * RS_SNR */ //added by ouyang android.util.Log.e(oyp, snrIconLevel != -1 && rsrpIconLevel != -1, +return rsrpIconLevel < snrIconLevel ? rsrpIconLevel : snrIconLevel +(rsrpIconLevel < snrIconLevel)); return (rsrpIconLevel < snrIconLevel ? rsrpIconLevel : snrIconLevel); } if (snrIconLevel != -1) { //added by ouyang android.util.Log.e(oyp, snrIconLevel != -1); return snrIconLevel; } if (rsrpIconLevel != -1) { //added by ouyang android.util.Log.e(oyp, rsrpIconLevel != -1); return rsrpIconLevel; } /* Valid values are (0-63, 99) as defined in TS 36.331 */ if (mLteSignalStrength > 63) { rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } else if (mLteSignalStrength >= 12) { rssiIconLevel = SIGNAL_STRENGTH_GREAT; } else if (mLteSignalStrength >= 8) { rssiIconLevel = SIGNAL_STRENGTH_GOOD; } else if (mLteSignalStrength >= 5) { rssiIconLevel = SIGNAL_STRENGTH_MODERATE; } else if (mLteSignalStrength >= 0) { rssiIconLevel = SIGNAL_STRENGTH_POOR; } //added by ouyang android.util.Log.e(oyp, getLTELevel - rssi: + mLteSignalStrength + rssiIconLevel: + rssiIconLevel); if (DBG) { log(getLTELevel - rssi: + mLteSignalStrength + rssiIconLevel: + rssiIconLevel); } return rssiIconLevel; //[ALPS01440836][ALPS01594704]-END: change level mapping rule of signal for CMCC }
可以看到未修改前,劃分的幾個等級是:
1.大於-85時候,等級為SIGNAL_STRENGTH_GREAT,即為4
2.大於-95時候,等級為SIGNAL_STRENGTH_GOOD,即為3
3.大於-105時候,等級為SIGNAL_STRENGTH_MODERATE,即為2
4.大於-115時候,等級為SIGNAL_STRENGTH_POOR,即為1
5.大於-140時候,等級為SIGNAL_STRENGTH_NONE_OR_UNKNOWN,即為0
6.大於-44時候,等級為-1
修改後,將上面的幾個等級劃分改為:
1.大於-97時候,等級為SIGNAL_STRENGTH_GREAT,即為4
2.大於-105時候,等級為SIGNAL_STRENGTH_GOOD,即為3
3.大於-110時候,等級為SIGNAL_STRENGTH_MODERATE,即為2
4.大於-120時候,等級為SIGNAL_STRENGTH_POOR,即為1
5.大於-140時候,等級為SIGNAL_STRENGTH_NONE_OR_UNKNOWN,即為0
6.大於-44時候,等級為-1
由於上面的,加入了MTK的修復patch,代碼2如下:
//[ALPS01440836][ALPS01594704]-START: change level mapping rule of signal for CMCC if (!IS_BSP_PACKAGE) { IServiceStateExt ssExt = getPlugInInstance(); if (ssExt != null) { rsrpIconLevel = ssExt.mapLteSignalLevel(mLteRsrp, mLteRssnr, mLteSignalStrength); //added by ouyang android.util.Log.e(oyp, ssExt != null, rsrpIconLevel:+ rsrpIconLevel); return rsrpIconLevel; } else { log([getLteLevel] null plug-in instance); } }
上面代碼的意思是,先把這等級劃分的值從加入的插件中去獲取,如果獲取不到再執行我上面修改的,所以要去修改
IServiceStateExt的mapLteSignalLevel(mLteRsrp, mLteRssnr, mLteSignalStrength)方法。當然如果沒有這個插件的話,可以直接把我上面的這段代碼2從代碼1中注釋即可。
由於IServiceStateExt是個接口,所以去修改它的具體實現類。通過查找源代碼,找到了實現類DefaultServiceStateExt。
該類目錄位於:vendor/mediatek/proprietary/frameworks/base/packages/FwkPlugin/src/com/mediatek/op/telephony/DefaultServiceStateExt.java
修改後代碼如下:
//[ALPS01440836][ALPS01594704]-START: change level mapping rule of signal for CMCC public int mapLteSignalLevel(int mLteRsrp, int mLteRssnr, int mLteSignalStrength) { //added by ouyang android.util.Log.e(mapLteSignalLevel, mapLteSignalLevel starting .......); /* * TS 36.214 Physical Layer Section 5.1.3 TS 36.331 RRC RSSI = received * signal + noise RSRP = reference signal dBm RSRQ = quality of signal * dB= Number of Resource blocksxRSRP/RSSI SNR = gain=signal/noise ratio * = -10log P1/P2 dB */ int rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; int rsrpIconLevel = -1; int snrIconLevel = -1; //modifed by ouyang [2015-10-14] start // 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; // } if (mLteRsrp > -44) { rsrpIconLevel = -1; } else if (mLteRsrp >= -97) { rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_GREAT; } else if (mLteRsrp >= -105) { rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_GOOD; } else if (mLteRsrp >= -110) { rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_MODERATE; } else if (mLteRsrp >= -120) { rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_POOR; } else if (mLteRsrp >= -140) { rsrpIconLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } //added by ouyang android.util.Log.e(mapLteSignalLevel, getLTELevel - rsrp: + mLteRsrp + rsrpIconLevel:+ rsrpIconLevel); //modifed by ouyang [2015-10-14] end /* * Values are -200 dB to +300 (SNR*10dB) RS_SNR >= 13.0 dB =>4 bars 4.5 * dB <= RS_SNR < 13.0 dB => 3 bars 1.0 dB <= RS_SNR < 4.5 dB => 2 bars * -3.0 dB <= RS_SNR < 1.0 dB 1 bar RS_SNR < -3.0 dB/No Service Antenna * Icon Only */ if (mLteRssnr > 300) { snrIconLevel = -1; } else if (mLteRssnr >= 130) { snrIconLevel = SignalStrength.SIGNAL_STRENGTH_GREAT; } else if (mLteRssnr >= 45) { snrIconLevel = SignalStrength.SIGNAL_STRENGTH_GOOD; } else if (mLteRssnr >= 10) { snrIconLevel = SignalStrength.SIGNAL_STRENGTH_MODERATE; } else if (mLteRssnr >= -30) { snrIconLevel = SignalStrength.SIGNAL_STRENGTH_POOR; } else if (mLteRssnr >= -200) { snrIconLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } //added by ouyang android.util.Log.e(mapLteSignalLevel, getLTELevel - snr: + mLteRssnr + snrIconLevel: + snrIconLevel); Log.i(TAG, getLTELevel - rsrp: + mLteRsrp + snr: + mLteRssnr + rsrpIconLevel: + rsrpIconLevel + snrIconLevel: + snrIconLevel); /* Choose a measurement type to use for notification */ if (snrIconLevel != -1 && rsrpIconLevel != -1) { /* * The number of bars displayed shall be the smaller of the bars * associated with LTE RSRP and the bars associated with the LTE * RS_SNR */ //added by ouyang android.util.Log.e(mapLteSignalLevel, snrIconLevel != -1 && rsrpIconLevel != -1, +return rsrpIconLevel < snrIconLevel ? rsrpIconLevel : snrIconLevel +(rsrpIconLevel < snrIconLevel)); return (rsrpIconLevel < snrIconLevel ? rsrpIconLevel : snrIconLevel); } if (snrIconLevel != -1) { //added by ouyang android.util.Log.e(mapLteSignalLevel, snrIconLevel != -1); return snrIconLevel; } if (rsrpIconLevel != -1) { //added by ouyang android.util.Log.e(mapLteSignalLevel, rsrpIconLevel != -1); return rsrpIconLevel; } /* Valid values are (0-63, 99) as defined in TS 36.331 */ if (mLteSignalStrength > 63) { rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; } else if (mLteSignalStrength >= 12) { rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_GREAT; } else if (mLteSignalStrength >= 8) { rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_GOOD; } else if (mLteSignalStrength >= 5) { rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_MODERATE; } else if (mLteSignalStrength >= 0) { rssiIconLevel = SignalStrength.SIGNAL_STRENGTH_POOR; } //added by ouyang android.util.Log.e(mapLteSignalLevel, getLTELevel - rssi: + mLteSignalStrength + rssiIconLevel: + rssiIconLevel); Log.i(TAG, getLTELevel - rssi: + mLteSignalStrength + rssiIconLevel: + rssiIconLevel); return rssiIconLevel; } //[ALPS01440836][ALPS01594704]-END: change level mapping rule of signal for CMCC
修改完代碼後,make systemimage後燒錄到MTK平台手機即可。
====================================================================================
修改後的效果圖如下所示:
1、當信號大於等於-97dBm時候,信號顯示滿格,而修改之前需要大於-85dBm。
2、當信號大於等於-105dBm時候,而小於-97dBm時,信號顯示少一個,而修改之前需要大於-95dBm。
3、當信號大於等於-110dBm時候,而小於-105dBm時,信號顯示2格,不好捕捉到。
4、當信號大於等於-120dBm時候,而小於-110dBm時,信號顯示1格,不好捕捉到。
5、當信號大於等於-140dBm時候,而小於-120dBm時,信號顯示0格,不好捕捉到。
====================================================================================
當然,要修改電信、移動、聯通的3G、2G信號也可以在這個類中去修改。
最後附上源代碼 rameworksase elephonyjavaandroid elephonySignalStrength.java
====================================================================================
vendor/mediatek/proprietary/frameworks/base/packages/FwkPlugin/src/com/mediatek/op/telephony/DefaultServiceStateExt.java代碼如下:
最近看到DrawerLayout,support v4中提供的類,想到對google提供的這些支持庫,自己一點都不熟悉,想著看看Google提供的支持庫都有什麼內容。結果
Debug斷點跟蹤調試是軟件開發過程中分析代碼、解決BUG的一個重要手段,不同IDE下的Debug工具的使用有所不同,但提供的調試功能一定是應有盡有。很多程序員的Debu
1.下載安裝android studio下載好之後安裝好 2.啟動報錯提示 1)進入剛安裝的Android Studio目錄下的bin目錄。找到ide
只有簡單的三步,官網寫的非常簡明全面,非常佩服 【准備】 1. Eclipse(Indigo) 2. ADT: 這個不說了,無非就是eclipse添加個an
本菜開源的一個自己寫的Demo,希望能給Androider們有所幫助,