Android – Сила сигнала на уровне, DBM и ASU

В настоящее время я пишу приложение для клиента, который хочет собирать данные о мощности сигнала с установленными интервалами.

В настоящее время я использую этот код:

private static class MyPhoneStateListener extends PhoneStateListener { @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { super.onSignalStrengthsChanged(signalStrength); telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); InfoStore.setSignal(String.valueOf(signalStrength.getGsmSignalStrength())); } }; 

Это работает отлично, однако клиент хочет уровень сигнала на обоих уровнях (я думаю, сколько баров?), DBM и ASU.

Кто-нибудь знает, как читать сильные стороны сигнала, используя эти разные формы?

    Как упоминалось Чарльзом Ма и Кевином Крумвидеем, соответствующие методы Android скрыты (вероятно, по уважительной причине), однако по-прежнему можно получить значения путем отражения. Таким образом, одно решение оригинального вопроса:

     private class MyPhoneStateListener extends PhoneStateListener { public static final int INVALID = Integer.MAX_VALUE; public int signalStrengthDbm = INVALID; public int signalStrengthAsuLevel = INVALID; @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { signalStrengthDbm = getSignalStrengthByName(signalStrength, "getDbm"); signalStrengthAsuLevel = getSignalStrengthByName(signalStrength, "getAsuLevel"); } private int getSignalStrengthByName(SignalStrength signalStrength, String methodName) { try { Class classFromName = Class.forName(SignalStrength.class.getName()); java.lang.reflect.Method method = classFromName.getDeclaredMethod(methodName); Object object = method.invoke(signalStrength); return (int)object; } catch (Exception ex) { return INVALID; } } } 

    В android 4.x класс SignalStrength имеет методы getAsuLevel, getDbm, а также getLevel (бары).

    Если вам нужно, чтобы это работало для старых версий Android, посмотрите исходный код, и вы можете скопировать реализации этих методов. http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.1.2_r1/android/telephony/SignalStrength.java/

    Единственное, чего вы не можете получить, это измерения Lte в старых версиях Android, но вы, вероятно, можете использовать java-отражение, чтобы увидеть, существуют ли методы getLte * и называть их.

    Вычислить дБм на

     int SignalStrength_ASU = signalStrength.getGsmSignalStrength(); int SignalStrength_dBm = (2 * SignalStrength_ASU) - 113; // -> dBm 
    Intereting Posts