2013-02-20 2 views
5

В настоящее время я пишу приложение для клиента, который хочет собирать данные о мощности сигнала с установленными интервалами.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 и ВРУ.

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

ответ

2

В 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 * и называть их.

+2

Эти методы в 'SignalStrength' скрыты. –

0

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

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

Как уже упоминалось Чарльз Ма и Кевин Krumwiede соответствующие 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; 
     } 
    } 
}