您的位置:首页 > 移动开发 > Android开发

Android6.0获取4G信号的信号强度(dbm)

2018-02-07 13:05 441 查看
起因:项目需要获取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);

通过这个方法能获取出和系统一样的信号格数。



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐