【问题标题】:Android - Signal Strength in Level, DBM, and ASUAndroid - Level、DBM 和 ASU 中的信号强度
【发布时间】:2013-02-04 21:53:30
【问题描述】:

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

目前我正在使用此代码:

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 的信号强度。

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

【问题讨论】:

    标签: android signal-strength


    【解决方案1】:

    正如 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】:

      在 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* 方法是否存在并调用它。

      【讨论】:

      • SignalStrength 中的那些方法是隐藏的。
      【解决方案3】:

      计算dBm

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

      【讨论】:

        猜你喜欢
        • 2013-07-26
        • 2015-12-02
        • 1970-01-01
        • 2014-03-01
        • 2011-05-12
        • 2012-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多