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);
通过这个方法能获取出和系统一样的信号格数。
 



  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值