SignalStrength - getSignalStrength() - getLevel()

SignalStrength - getSignalStrength() - getLevel()

我可以通过回调

轻松获得 Android 中的 sigalStrength
 onSignalStrengthsChanged(SignalStrength signalStrength)

并通过传递的对象检索信号强度

int signal_strength = signalStrength.getGsmSignalStrength();

根据文档,该值在 0 到 39.99 之间变化

现在我想在我的应用程序中显示这个指示器,该指示器随着信号强度的变化而更新 - 正是您在 phone.

的状态栏中看到的内容

所以我的问题 - 我如何为此使用变量?如果它是线性的,那么很容易只使用 1 - 10、11 - 20 等的间隔。但我想它并不那么容易?

我知道我可以通过调用 ..

来标准化这个值
 int level = signalStrength.getLevel()

也就是说,通过调用 getLevel 然后我得到一个介于 0 - 4 之间的值,就像 RSSI 对 WIFI 所做的那样。但问题是它需要 api 23,这意味着我只能达到 android 市场的大约 40%。

那么 - 如果我不想使用 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();
    }          
}