SignalStrength - getSignalStrength() - getLevel()

问题描述 投票:2回答:1

我可以通过回调轻松获得Android中的sigalStrength

 onSignalStrengthsChanged(SignalStrength signalStrength)

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

int signal_strength = signalStrength.getGsmSignalStrength();

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

现在我想在我的应用程序中显示一个指示符,该指示符随信号变化而变化 - 正是您在手机状态栏中可以看到的内容。

所以我的问题 - 如何使用变量呢?如果它是线性的,它很容易使用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();
}
android rssi phone-state-listener
1个回答
1
投票

请在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();
    }          
}
© www.soinside.com 2019 - 2024. All rights reserved.