2013-02-20 11 views
5

में सिग्नल शक्ति, मैं वर्तमान में एक ऐसे ग्राहक के लिए एक आवेदन लिख रहा हूं जो सेट अंतराल पर सिग्नल शक्ति के बारे में डेटा एकत्र करना चाहता है।एंड्रॉइड - स्तर, डीबीएम, और एएसयू

वर्तमान में मैं इस कोड का उपयोग कर रहा हूँ:

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

यह ठीक काम करता है, फिर भी ग्राहक दोनों के स्तर में सिग्नल की शक्ति (? मैं कैसे कई बार लगता है कि), डी बी एम, और ASU चाहता है।

किसी के पास कोई अलग संकेत है कि सिग्नल शक्तियों को उन विभिन्न रूपों का उपयोग करके कैसे पढ़ा जाए?

उत्तर

2

एंड्रॉइड 4.x में सिग्नलस्टेंथ क्लास को एसुएलवेल, getDbm, साथ ही getLevel (बार) विधियां मिल गई हैं।

यदि आपको पुराने एंड्रॉइड संस्करणों के लिए काम करने की आवश्यकता है, तो स्रोत कोड पर एक नज़र डालें और आप उन तरीकों के कार्यान्वयन की प्रतिलिपि बना सकते हैं। http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.1.2_r1/android/telephony/SignalStrength.java/

एकमात्र चीज जिसे आप प्राप्त नहीं कर सकते हैं वह पुराने एंड्रॉइड संस्करणों में एलटीई माप है, लेकिन आप शायद यह देखने के लिए जावा प्रतिबिंब का उपयोग कर सकते हैं कि getLte * विधियां मौजूद हैं और इसे कॉल करें।

+2

'सिग्नलस्टेंथ' में उन विधियों को छुपाया गया है। –

0

गणना dBm

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

चार्ल्स मा और केविन Krumwiede प्रासंगिक एंड्रॉयड तरीकों छिपे हुए हैं (शायद अच्छे कारण के लिए) ने उल्लेख किया द्वारा, लेकिन यह अभी भी प्रतिबिंब द्वारा मूल्यों को प्राप्त करना संभव है। इस प्रकार मूल प्रश्न का एक समाधान:

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