回答
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);
}
}
我可以獲得1/4的GSM等級狀態嗎?我需要針對4.x - 7.x的解決方案。 – gtzinos
請注意.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-31,99。從[這裏](https://developer.android.com/reference/android/telephony/SignalStrength.html#getGsmSignalStrength())。順便說一句,你有什麼想法,爲什麼它在大多數情況下返回99? –
不適用於LTE UMTS信號,它會給你0-91,255。當我第一次遇到它時,這也讓我感到困惑。在這裏,我預計最多31歲,但我收到了47的價值! 99或255表示沒有可用的數據。 –
詢問的用戶應該提供了更多信息或反饋。這就是說...
這個問題根本不是微不足道的:因爲它是一個以分貝爲單位的標度,它不是線性的,因此,當信號較低時,較小的變化會產生較大的影響,而較大的變化則不那麼重要高。這就是爲什麼我很抱歉地說所有其他答案都會得到與手機上顯示的值不匹配的不準確值。
假設你已經有了一個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信號中的增益因子。
getGsmLevel僅適用於特定版本。任何通用解決方案 – gtzinos
是的,當然是:獲取'getGsmLevel()'的代碼並將其調整爲一個靜態方法,它將一個'SignalStrength'對象作爲參數,並用它獲取調用'getGsmSignalStrength()'的asu值,該值是所有版本。 –
- 1. Android中的LTE信號強度與GSM信號強度
- 2. 檢索GSM網絡信息Android?
- 3. 如何檢索Android上的GSM信號質量參數?
- 4. Android Wifi信號強度
- 5. Android的FM信號強度
- 6. Android雙卡信號強度
- 7. 獲取手機(GSM)信號強度而不使用私有API
- 8. GSM信號強度測量始終顯示0
- 9. GSM返回'99'時如何確定信號強度?
- 10. Android中獲取WiFi信號強度
- 11. Android中的藍牙信號強度
- 12. iPhone信號強度
- 13. linux中的信號強度
- 14. 獲取信號強度列表android
- 15. Android藍牙讀取rssi信號強度
- 16. 的Android:確定GPS信號強度
- 17. Android:如何監控WiFi信號強度
- 18. Android模擬器:無信號強度
- 19. Android - Level,DBM和ASU的信號強度
- 20. 可視化Android藍牙信號強度
- 21. Android模擬低數據信號強度
- 22. Android檢查網絡信號強度是否較低
- 23. 我如何檢查Android的GPS信號強度
- 24. 聲音信號在matlab中的強度
- 25. 3G信號強度(桌面)
- 26. 尋找GPS信號強度
- 27. C++ WiFi信號強度
- 28. 即時信號強度
- 29. 信號強度ios 7
- 30. 在Android中顯示WiFi信號強度(顯示條)
你有沒有去過這裏http://www.firstdroid.com/2010/05/12/get-provider-gsm-signal-strength/ – PedroAGSantos
如果這是你要搜索的東西,請在搜索前詢問 – PedroAGSantos