我可以通过回拨在Android中轻松获得信号强度

 onSignalStrengthsChanged(SignalStrength signalStrength)

并通过传递的对象检索信号强度
int signal_strength = signalStrength.getGsmSignalStrength();

根据文档,该值在0到39.99之间变化
现在我想在我的应用程序中用一个指示器显示这一点,当信号强度变化时会更新,这正是你在手机状态栏中看到的。
所以我的问题-我如何使用这个变量?如果它是线性的,那么很容易使用1-10,11-20等区间,但我想不是那么容易吗?
我知道只要打电话给..我就可以标准化这个值。
 int level = signalStrength.getLevel()

这是通过调用getlevel,然后我得到一个介于0-4之间的值,就像rssi对wifi所做的那样。但问题是它需要API23,这意味着我只能达到大约40%的Android市场。
所以-如果我不想使用getlevel,那么如何相应地使用getgsmsignalstrength()呢?
  @Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
    super.onSignalStrengthsChanged(signalStrength);

    int signal_strength = signalStrength.getGsmSignalStrength();

    //int level = signalStrength.getLevel(); //api 23

    Toast.makeText(context, "signalStrength: " + signal_strength, Toast.LENGTH_SHORT).show();
}

最佳答案

onSignalStrengthsChanged中尝试以下代码片段。我是通过反射来实现的。它适用于所有类型的网络类。希望有帮助。

@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
    super.onSignalStrengthsChanged(signalStrength);

    int level = 0;
    try {
        final Method m = SignalStrength.class.getDeclaredMethod("getLevel", (Class[]) null);
        m.setAccessible(true);
        level = (Integer) m.invoke(signalStrength, (Object[]) null);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

10-06 03:38