2011-08-26 55 views

回答

1

你這谷歌這一切?見this,thisthis。就百分比而言,我相信你可能只是不得不轉換。

+0

你的鏈接don'幫助,任何解決方案4.x - 7.x? – gtzinos

3
public class MyActivity extends Activity { 
    public static final int UNKNOW_CODE = 99; 
    int MAX_SIGNAL_DBM_VALUE = 31; 

    TelephonyManager tel; 
MyPhoneStateListener myPhoneStateListener; 

    @Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    View view = getLayoutInflater().inflate(R.layout.activity_about, null); 
    setContentView(view); 

    myPhoneStateListener = new MyPhoneStateListener(); 
    tel = (TelephonyManager) PpsApplication.getAppContext().getSystemService(Context.TELEPHONY_SERVICE); 
    tel.listen(myPhoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); 
} 

private class MyPhoneStateListener extends PhoneStateListener { 
    /* Get the Signal strength from the provider, each tiome there is an update */ 
    @Override 
    public void onSignalStrengthsChanged(SignalStrength signalStrength) { 
     super.onSignalStrengthsChanged(signalStrength); 

     if (null != signalStrength && signalStrength.getGsmSignalStrength() != UNKNOW_CODE) { 
      int signalStrengthPercent = calculateSignalStrengthInPercent(signalStrength.getGsmSignalStrength()); 
      viewModel.setSignalStrengthString(IntegerHelper.getString(signalStrengthPercent)); 
     } 
    } 
} 

private int calculateSignalStrengthInPercent(int signalStrength) { 
    return (int) ((float) signalStrength/MAX_SIGNAL_DBM_VALUE * 100); 
} 

} 
+0

我可以獲得1/4的GSM等級狀態嗎?我需要針對4.x - 7.x的解決方案。 – gtzinos

1

請注意.getGsmSignalStrength();現在只返回小節:0-5,99

實際值現在隱藏。你仍然可以使用反射來獲得它們:

   int strength=signalStrength.getGsmSignalStrength();//number of bars not ASU 
       Log.v("Mobile","BARS: "+strength); 
       try{//Actual signal strength is hidden 
        Class classFromName = Class.forName(SignalStrength.class.getName()); 
        java.lang.reflect.Method method = classFromName.getDeclaredMethod("getAsuLevel");//getDbm 
        strength = (int) method.invoke(signalStrength); 
       }catch (Exception ex){Log.v("Mobile","cant retreive");} 
       if (strength == 99) { Log.v("Mobile", "ERROR! GSM signal strength not available!");return;}//99 = Unknown 
       if (strength == 255) { Log.v("Mobile", "ERROR! UMTS signal strength not available!");return;}//255 = Unknown 

上面的例子僅適用於ASU,它似乎比Dbm更好。你得到的ASU值後,你就可以轉儲成百分比:

   Log.v("Mobile","ASU: "+strength); 
       //Data.mobile_signal=strength*20;//Number of bars 0-5 
       //Data.mobile_signal = 100-((strength-113)/62);//GSM DBM 
       Data.mobile_signal =(int)((double)strength*100/31);//GSM ASU 
       Data.mobile_signal =(int)((double)strength*100/91);//UMTS ASU 
       Log.v("Mobile","Set GSM signal from "+strength+" to "+Data.mobile_signal); 

提醒一下,這是當你有一個GSM信號不是一個CDMA信號。使用TelephonyManager.getPhoneType();以確定哪個: 1 = GSM,2 = CDMA,3 = SIP

但是等待!這說我只有50%的信號強度,但我有5個酒吧!這是錯誤的!

嗯,不完全是。除非你的手機正好在發射器前面,否則它可能不會是100%。但50%的信號質量約爲100%。所以從這裏你必須有創意。

+0

它實際上返回值0-31,99。從[這裏](https://developer.android.com/reference/android/telephony/SignalStrength.html#getGsmSignalStrength())。順便說一句,你有什麼想法,爲什麼它在大多數情況下返回99? –

+0

不適用於LTE UMTS信號,它會給你0-91,255。當我第一次遇到它時,這也讓我感到困惑。在這裏,我預計最多31歲,但我收到了47的價值! 99或255表示沒有可用的數據。 –

3

詢問的用戶應該提供了更多信息或反饋。這就是說...

這個問題根本不是微不足道的:因爲它是一個以分貝爲單位的標度,它不是線性的,因此,當信號較低時,較小的變化會產生較大的影響,而較大的變化則不那麼重要高。這就是爲什麼我很抱歉地說所有其他答案都會得到與手機上顯示的值不匹配的不準確值。

假設你已經有了一個SignalStrength對象(如果沒有,還有另外一個不錯的答案,顯示瞭如何做到這一點),在棉花糖它解決了方法getGsmLevel()(還有所有其他信號的方法,甚至聯合下),返回線性化刻度0-4。您可以查看SignalStrength的源代碼。

/** 
* Get gsm as level 0..4 
* 
* @hide 
*/ 
public int getGsmLevel() { 
    int level; 
    // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5 
    // asu = 0 (-113dB or less) is very weak 
    // signal, its better to show 0 bars to the user in such cases. 
    // asu = 99 is a special case, where the signal strength is unknown. 
    int asu = getGsmSignalStrength(); 
    if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 
    else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT; 
    else if (asu >= 8) level = SIGNAL_STRENGTH_GOOD; 
    else if (asu >= 5) level = SIGNAL_STRENGTH_MODERATE; 
    else level = SIGNAL_STRENGTH_POOR; 
    if (DBG) log("getGsmLevel=" + level); 
    return level; 
} 

有一個0-100%比例這不是很有意義,因爲它是這件事情小粒度,這就是爲什麼它是比較常用的一個0-4範圍,並在此方法中,它已經線性化。如果不是在棉花糖,只要適應這種方法接收對象作爲價值。如果由於某些原因你確實需要一個0-100的範圍,你應該使用dB線性轉換函數,但我不瞭解GSM信號中的增益因子。

+0

getGsmLevel僅適用於特定版本。任何通用解決方案 – gtzinos

+0

是的,當然是:獲取'getGsmLevel()'的代碼並將其調整爲一個靜態方法,它將一個'SignalStrength'對象作爲參數,並用它獲取調用'getGsmSignalStrength()'的asu值,該值是所有版本。 –