安卓手机- 信号强度的级别、DBM和ASU表示方法

5

我目前正在为客户撰写一份应用程序,该客户希望在设定的时间间隔内收集有关信号强度的数据。

目前我正在使用以下代码:

private static class MyPhoneStateListener extends PhoneStateListener
{
  @Override
  public void onSignalStrengthsChanged(SignalStrength signalStrength)
  {
     super.onSignalStrengthsChanged(signalStrength);
     telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
     InfoStore.setSignal(String.valueOf(signalStrength.getGsmSignalStrength()));
  }
};

这个工作很好,然而客户想要以等级(我猜是几个条形图?)、DBM和ASU的形式获得信号强度。

有人知道如何使用这些不同的形式读取信号强度吗?

3个回答

8
如Charles Ma和Kevin Krumwiede所提到的那样,相关的Android方法被隐藏起来了(可能是出于某种良好的原因),但是仍然可以通过反射获取这些值。因此,对于原始问题,有一种解决方案:
private class MyPhoneStateListener extends PhoneStateListener
{
    public static final int INVALID = Integer.MAX_VALUE;

    public int signalStrengthDbm = INVALID;
    public int signalStrengthAsuLevel = INVALID;

    @Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength)
    {
        signalStrengthDbm = getSignalStrengthByName(signalStrength, "getDbm");
        signalStrengthAsuLevel = getSignalStrengthByName(signalStrength, "getAsuLevel");
    }

    private int getSignalStrengthByName(SignalStrength signalStrength, String methodName)
    {
        try
        {
            Class classFromName = Class.forName(SignalStrength.class.getName());
            java.lang.reflect.Method method = classFromName.getDeclaredMethod(methodName);
            Object object = method.invoke(signalStrength);
            return (int)object;
        }
        catch (Exception ex)
        {
            return INVALID;
        }
    }
}

2

2
SignalStrength 中的那些方法是隐藏的。 - Kevin Krumwiede

0

通过编程计算 dBm

int SignalStrength_ASU = signalStrength.getGsmSignalStrength();
int SignalStrength_dBm = (2 * SignalStrength_ASU) - 113; // -> dBm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接