1. 程式人生 > >Android6.0獲取4G訊號的訊號強度(dbm)

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);
通過這個方法能獲取出和系統一樣的訊號格數。