Android6.0獲取4G訊號的訊號強度(dbm)
起因:專案需要獲取4G訊號強度,進行顯示。
經過:通過google,發現獲取4G訊號強度都是通過讀取字串的方式獲取,但是我還沒有搞懂取出的是什麼,也不知道怎麼通過那個值轉化成顯示的格數。
所以,我想看看系統是怎麼實現的,看看能不能用跟系統同樣的方式獲取dbm值或者取出訊號強度的格數。
結果:經過一番折騰,終於找到了一個隱藏的方法:
在frameworks\base\telephony\java\android\telephony\SignalStrength.java內找到該方法
/**
* Get the signal strength as dBm
*
* @hide
*/
public int getDbm() {
int dBm;
if(isGsm()) {
dBm = getLteDbm();
//MTE-START [ALPS01200757]
//if (dBm == INVALID) {
if (!isCampOnLte()) {
//MTE-END [ALPS01200757]
dBm = getGsmDbm();
}
} else {
int cdmaDbm = getCdmaDbm();
int evdoDbm = getEvdoDbm();
return (evdoDbm == -120 || evdoDbm == -113) ? cdmaDbm
: ((cdmaDbm == -120 || cdmaDbm == -113) ? evdoDbm
: (cdmaDbm < evdoDbm ? cdmaDbm : evdoDbm));
}
if (DBG) {
log("getDbm=" + dBm);
}
return dBm;
}
但是該方法是隱藏的,湊巧的是,通過方法
public void onSignalStrengthsChanged(SignalStrength signalStrength)
來監聽4G訊號變化,剛好有SignalStrehgth物件,那就通過反射的方式獲取,正好
Method method1 = null;
method1 = signalStrength.getClass().getMethod("getDbm");
dbm = method1.invoke(signalStrength);
這樣就能取出dbm值了。 注: Method method2 = signalStrength.getClass().getMethod("getLteLevel");level = method2.invoke(signalStrength);