Получить уровень сигнала GSM в Android

Я новичок в Android.

Как получить силу сигнала GSM в процентах (1 – 100%)?

Вы вообще это сделали? Смотрите это , это или это . Что касается процента, я уверен, что вам, вероятно, просто нужно как-то конвертировать.

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

Пользователь, который попросил, должен предоставить дополнительную информацию или отзывы. Тем не менее …

Вопрос не является тривиальным вообще: поскольку он является шкалой в децибелах, он не является линейным, и, следовательно, меньшие изменения оказывают большее влияние, когда сигнал низкий, в то время как большие изменения менее важны, когда значение велико. Вот почему я сожалею, что все остальные ответы будут получать неточные значения, которые не совпадают с отображаемыми на телефоне.

Предполагая, что у вас уже есть объект SignalStrength (если нет, есть еще один хороший ответ, который показывает, как это сделать), в Marshmallow он решается с помощью метода 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, и в этом методе он уже линеаризован. Если не в Marshmallow, просто адаптируйте этот метод, чтобы получить объект в качестве значения. Если вам действительно нужен диапазон 0-100 по какой-то причине, вы должны использовать функцию дБ для линейного преобразования, но я не знаю коэффициента усиления в сигналах GSM.

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

Intereting Posts
Пытается реплицировать выравнивание столбцов GridLayout с помощью ConstraintLayout Создание оптимизированной / подходящей для OCR активности камеры Как отправить приложение для приложения fb, например, приложение Kiwi Десятичная запятая или десятичная запятая в Android Android получает предыдущую активность Закройте все недавние открытые / запущенные приложения сразу с кнопочным андроидом Галерея изображений с горизонтальной прокруткой Инициализация Android AudioRecord терпит неудачу каждый раз Java System.nanoTime () огромная разница в истекшем времени Как указать имя папки макетов для поддержки множественного размера экрана в android OnTouch не работает в Live Wallpaper Android NDK ОЧЕНЬ долгое время сборки Как показать внешние html / веб-страницы внутри приложения для Android? В чем разница между тегом layout_alignStart и layout_alignLeft? Это android-priority-job-queue и job scheduler две разные вещи?