2013-02-20 11 views
5

Obecnie piszę aplikację dla klienta, który chce zebrać dane dotyczące siły sygnału w określonych odstępach czasu.Android - Siła sygnału na poziomie, DBM i ASU

Obecnie używam tego kodu:

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

To działa prawidłowo, jednak klient chce siłę sygnału zarówno w poziomie (chyba ilu bary?), DBm i ASU.

Ktoś ma jakąś wskazówkę, jak odczytywać moc sygnału za pomocą tych różnych formularzy?

Odpowiedz

2

W Androidzie 4.x klasa SignalStrength ma metody getAsuLevel, getDbm oraz getLevel (bars).

Jeśli potrzebujesz tego do starszych wersji Androida, spójrz na kod źródłowy i możesz skopiować implementacje tych metod. http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.1.2_r1/android/telephony/SignalStrength.java/

Jedyne, czego nie można uzyskać, to pomiary Lte w starszych wersjach systemu Android, ale prawdopodobnie można użyć refleksji java, aby sprawdzić, czy istnieją metody getLte * i wywołać je.

+2

Te metody w 'SignalStrength' są ukryte. –

0

Oblicz dBm przez

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

Jak wspomniano przez Charles Ma i Kevin Krumwiede odpowiednich metod Android są ukryte (prawdopodobnie dla dobrego powodu), jednak jest to nadal możliwe, aby uzyskać wartości, refleksji. Tak więc jedno rozwiązanie do pierwotnego pytania:

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; 
     } 
    } 
} 
Powiązane problemy