編輯:關於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提供的支持庫都有什麼內容。結果
Android Studio調試技巧
Debug斷點跟蹤調試是軟件開發過程中分析代碼、解決BUG的一個重要手段,不同IDE下的Debug工具的使用有所不同,但提供的調試功能一定是應有盡有。很多程序員的Debu
Android studio安裝與調試
1.下載安裝android studio下載好之後安裝好 2.啟動報錯提示 1)進入剛安裝的Android Studio目錄下的bin目錄。找到ide
Android 使用OpenCV之編譯環境非CygWin方式(Win7+Eclipse+ADT+CDT+NDK)
只有簡單的三步,官網寫的非常簡明全面,非常佩服 【准備】 1. Eclipse(Indigo) 2. ADT: 這個不說了,無非就是eclipse添加個an
Android從零開搞系列:自定義View(6)ScrollTo+ScrollBy+Scroller+NestedScrolling機制(上)
本菜開源的一個自己寫的Demo,希望能給Androider們有所幫助,