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。

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

4

3 回答 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;
        }
    }
}
于 2016-03-17T21:07:58.023 回答
2

在 android 4.x 中,SignalStrength 类具有 getAsuLevel、getDbm 以及 getLevel (bars) 方法。

如果您需要它适用于较旧的 android 版本,请查看源代码,您可以复制这些方法的实现。 http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.1.2_r1/android/telephony/SignalStrength.java/

您唯一无法获得的是旧 android 版本中的 Lte 测量值,但您可能可以使用 java 反射来查看 getLte* 方法是否存在并调用它。

于 2013-02-27T20:01:49.020 回答
0

计算 dBm

int SignalStrength_ASU = signalStrength.getGsmSignalStrength();
int SignalStrength_dBm = (2 * SignalStrength_ASU) - 113; // -> dBm
于 2014-09-26T10:37:11.030 回答