在Android中检索GSM信号强度

Ash*_*raf 5 android gsm signal-strength

我是Android的新手。

如何获得以百分比(1-100%)表示的GSM信号强度?

Yag*_*dal 5

询问的用户应该提供了更多的信息或反馈。那个...

这个问题根本不是一件容易的事:因为它是一个以分贝为单位的标度,所以它不是线性的,因此,当信号低时,较小的变化会产生较大的影响,而当值高时,较大的变化则不那么重要。这就是为什么我很遗憾地说所有其他答案将得到与电话上显示的值不匹配的不准确值的原因。

假设您已经有一个SignalStrength对象(如果没有,还有一个不错的答案显示了如何执行此操作),在棉花糖中,可以使用getGsmLevel()返回线性化比例尺0-4 的方法(也有用于所有其他信号甚至组合的方法)来解决。您可以从类中检查源代码SignalStrength

/**
 * Get gsm as level 0..4
 *
 * @hide
 */
public int getGsmLevel() {
    int level;
    // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
    // asu = 0 (-113dB or less) is very weak
    // signal, its better to show 0 bars to the user in such cases.
    // asu = 99 is a special case, where the signal strength is unknown.
    int asu = getGsmSignalStrength();
    if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
    else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT;
    else if (asu >= 8)  level = SIGNAL_STRENGTH_GOOD;
    else if (asu >= 5)  level = SIGNAL_STRENGTH_MODERATE;
    else level = SIGNAL_STRENGTH_POOR;
    if (DBG) log("getGsmLevel=" + level);
    return level;
}
Run Code Online (Sandbox Code Playgroud)

缩放比例为0-100%并不重要,因为它的粒度很小,这就是为什么它更常用0-4范围并且在此方法中已经线性化的原因。如果不在棉花糖中,只需修改此方法即可将对象作为值接收。如果出于某种原因确实需要0-100范围,则应使用dB到线性转换功能,但我不知道GSM信号中的增益因子。


小智 3

    public class MyActivity extends Activity {
    public static final int UNKNOW_CODE = 99;
    int MAX_SIGNAL_DBM_VALUE = 31;

    TelephonyManager tel;
MyPhoneStateListener myPhoneStateListener;

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View view = getLayoutInflater().inflate(R.layout.activity_about, null);
    setContentView(view);

    myPhoneStateListener = new MyPhoneStateListener();
    tel = (TelephonyManager) PpsApplication.getAppContext().getSystemService(Context.TELEPHONY_SERVICE);
    tel.listen(myPhoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
}

private class MyPhoneStateListener extends PhoneStateListener {
    /* Get the Signal strength from the provider, each tiome there is an update */
    @Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        super.onSignalStrengthsChanged(signalStrength);

        if (null != signalStrength && signalStrength.getGsmSignalStrength() != UNKNOW_CODE) {
            int signalStrengthPercent = calculateSignalStrengthInPercent(signalStrength.getGsmSignalStrength());
            viewModel.setSignalStrengthString(IntegerHelper.getString(signalStrengthPercent));
        }
    }
}

private int calculateSignalStrengthInPercent(int signalStrength) {
    return (int) ((float) signalStrength / MAX_SIGNAL_DBM_VALUE * 100);
}

}
Run Code Online (Sandbox Code Playgroud)