Имейте в виду, что .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% качество. Отсюда вы должны проявить творческий подход.