【问题标题】:SignalStrength - getSignalStrength() - getLevel()SignalStrength - getSignalStrength() - getLevel()
【发布时间】:2018-07-20 12:55:19
【问题描述】:

我可以通过回调轻松获得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 所做的那样。但问题是它需要 api 23,这意味着我只能达到大约 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();
}

【问题讨论】:

    标签: android rssi phone-state-listener


    【解决方案1】:

    尝试在您的onSignalStrengthsChanged 中使用以下代码 sn-p。我使用反射实现了它。它适用于所有类型的网络类。希望能帮助到你。

    @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();
        }          
    }
    

    【讨论】:

    • @java 很高兴它对你有所帮助!
    • 在 Kotlin 中怎么样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多