2013-02-20 14 views
5

현재 설정된 간격으로 신호 강도와 관련된 데이터를 수집하려는 클라이언트 용 애플리케이션을 작성하고 있습니다. 안드로이드 - 레벨, 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를 원한다.

누구나 다른 형식을 사용하여 신호 강도를 읽는 방법을 알 수 있습니까?

답변

2

안드로이드 4.x에서 SignalStrength 클래스는 getAsuLevel, getDbm 및 getLevel (bars) 메소드를 가지고 있습니다.

오래된 안드로이드 버전에서 작동하려면이 코드가 필요하면 소스 코드를 살펴보고 그 코드의 구현을 복사하십시오. 당신이 얻을 수 http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.1.2_r1/android/telephony/SignalStrength.java/

있는 유일한 방법은 이전 안드로이드 버전의 LTE 측정,하지만 당신은 아마 getLte * 방법이 존재하는지 확인하기 위해 자바 반사를 사용하고 호출 할 수 있습니다. 찰스 엄마와 케빈 Krumwiede (아마 좋은 이유) 숨겨진 관련 안드로이드의 방법으로 언급 한 바와 같이

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

'SignalStrength'에있는 해당 메서드는 숨겨져 있습니다. –

0

계산 dBm의, 그러나 반사에 의해 값을 얻기 위해 여전히 가능하다. 따라서 원래의 질문에 대한 한 가지 해결책은 :

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

에 의해