- Показатель уровня принимаемого сигнала на Android
- Получить уровень сигнала GSM/LTE
- Вопрос
- Pavel M
- Pavel M
- 12 ответов на этот вопрос
- Рекомендуемые сообщения
- Присоединяйтесь к обсуждению
- Похожий контент
- Собираем показания датчиков
- Общая информация
- Типы датчиков
- Таблица значений, возвращаемых датчиками
- Огласите весь список, пожалуйста!
- Интерфейс SensorEventListener — отслеживаем показания
- Динамические датчики
Показатель уровня принимаемого сигнала на Android
Начало исследования
Для начала, хотела бы спросить читателей. Когда Вы в последний раз при покупке нового смартфона, задумывались о качестве связи, предоставляемым вашим смартфоном? Этот критерий как-нибудь влияет на выбор телефона или версию Android при покупке нового гаджета? Правильно- нет. Я тоже на это не смотрела, пока не столкнулась с очень интересной ситуацией, о которой сейчас расскажу.
Итак. Все мы знаем, что существует достаточное количество стандартов как мобильных, так и локальных сетей. Самым распространенным стандартом локальных сетей является стандарт IEEE 802.11 (а, b, g, n и другие). У мобильных сетей- стандарт GSM-900 или GSM-1800 для Европы и Азии; GSM-850 и GSM-1900 для Африки и Америки. В этих стандартах используется показатель уровня принимаемого сигнала RSSI (received signal strength indicator). Он измеряется приемником по логарифмической шкале в децибелах (dBm). Однако в большинстве смартфонов на платформе Android используется другая система показателя уровня принимаемого сигнала — ASU. Если смотреть на градацию ASU и привычную всем RSSI, то получаем следующее соответствие:
0-1 ASU соответствует менее -110dBm RSSI, то есть возможно даже отключение сигнала.
2-3 ASU соответствует отрезку от -110 до -105 dBm RSSI, то есть очень слабый сигнал, так сказать «на грани отключения».
4-5 ASU соответствует отрезку от -105 до -95 dBm RSSI, то есть слабый сигнал, так сказать «пограничная зона».
6-7 ASU соответствует отрезку от -95 до -85 dBm RSSI, то есть уверенная связь на улице и транспорте.
Более 13 ASU соответствует нормальной связи в зданиях, то есть менее -75 dBm RSSI.
Однако, как оказалось, разные смартфоны по-разному определяют уровень сигнала в одном и том же помещении. Постараюсь сейчас это доказать.
Эксперимент и результаты
Итак. Вооружившись телефоном я походила по квартире и с помощью программ (GSM SIgnal Monitoring, Netmonitor и др., мне вот понравилась эта программа: www.kaibits-software.com/product_netwotksignaldonate.htm) измеряла сигнал в разных точках квартиры. (Большое спасибо разработчикам программ, которые сразу перевели получаемый сигнал в всем знакомую RSSI). Показываю на следующей картинке результаты моих замеров.
Все результаты полученных данных в dBm. По полученным данным я постаралась сделать диаграмму покрытия, с обозначением точек проведения измерений.
Смартфон участвующий в исследовании: Alcatel onetouch idol 3, версия Android 5.0.
Далее. Я попросила приятеля с его более «крутым» смартфоном провести тот же эксперимент. Привожу результаты.
Все результаты полученных данных измеряются в dBm.
Смартфон участвующий в исследовании: Nexus 5, версия Android 6.0.
Проверка уровня сигнала проходила с помощью одной и той же программы.
Выводы
В типичном случае распространения мобильно сигнала в жилом районе (к примеру), на распространение сигнала влияет множество факторов. Например: земная поверхность в зоне прямой видимости антенн, городская застройка, подвижные объекты (машины, строительные краны), высота нахождения приёмника (мобильного телефона), лифтовые шахты или разводка розеток… (Какие же непостоянные, эти сигналы!)
В итоге посмотрев на диаграмму покрытия, я поняла, что да: и лифтовые шахты, и разводка розеток повлияли на мои сигналы. Правда кроме этого, нет нигде базовых станций, что тоже негативно сказалось на уровне сигнала.
В ходе данного эксперимента было доказано, что разные смартфоны с разными версиями Android по-разному воспринимает уровень передаваемого сигнала в одних и тех же условиях. И хотя количество опытов, проведенных с Nexus 5, было меньше, чем с Idol 3, полученный результат подтверждает различный уровень приема сигнала.
Источник
Получить уровень сигнала GSM/LTE
Ответ от Pavel M,
10 февраля, 2016
Вопрос
Pavel M
Pavel M
Как получить уровень приема сотовой сети?
Google пользоваться умею, а вот отсутствие опыта дает о себе знать.
Буду благодарен за ссылки, что почитать для общего понятия написания по android c учетом специфики Delphi.
This constant was deprecated in API level 7.
by LISTEN_SIGNAL_STRENGTHS
Listen for changes to the network signal strength (cellular).
Constant Value: 2 (0x00000002)
Вот что пытаюсь сделать:
Пытаюсь и вот так
В на выходе конечно же получаю ошибку.
Как я понимаю тут надо создать какой то ресивер?
Он используется постоянно и вызываетя при событии описываемой в Delphi процедурой?
Или к нему разовый доступ и получение текущей информации при обращении к его свойствам?
Прошу больше помочь не готовым кодом, а что почитать. Поскольку есть желание понять.
Изменено 10 февраля, 2016 пользователем pvmmpv
Ссылка на комментарий
12 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Похожий контент
Итак, я установил себе новую Delphi 10.4 CE, так как у старой Delphi 10.3 CE кончился годовой срок. Однако, у меня возникла проблема с разработкой, точнее — с компиляцией приложений для Android. Дело в том, что в поставке новой Embarcadero RAD 10.4 отсутствует AVD Manager (эмулятор для Android), что вы и можете видеть на втором скрине. А когда я пытаюсь использовать старый, из набора Embarcadero RAD 10.3, компиляция вылетает с ошибкой, которую вы можете видеть на первом скрине.
В компанию требуется опытный разработчик, который готов присоединиться к команде для разработки крупного проекта в области Blockchain-технологий, распределенных систем и криптографии. Зп от 150 000 до 200 000 ₽. Удаленная работа.
— Работа с криптографическими алгоритмами, blockchain технологиями
— Разработка программного обеспечения на Delphi
— Участие в разработке блокчейн проекта нового поколения
— Разработка, поддержка и развитие серверных функций системы на основе Blockchain
— Отладка, анализ производительности оптимизация ПО;
— Проектирование и разработка архитектуры разрабатываемых решений;
— Опыт разработки ПО от 5 лет;
— Плюс: Понимание принципов работы публичных и закрытых блокчейнов (Ethereum/Solidity, Bitcoin, Quorum)
— Знание принципов ООП и шаблонов проектирования;
— Опыт работы с системами контроля версий ПО (Git)
— Уверенное владение языком программирования Delphi, средой разработки embarcadero
— Знание английского языка на уровне чтения технической литературы;
— Участие в интересном и масштабном проекте
— Дружный коллектив;
— Возможности развития и обучения
Бонусы
Бонусы по итогам года.
О нас:
Мы компания новаторов и энтузиастов в сфере блокчейн и криптовалют.
https://career.habr.com/vacancies/1000074707
Контакт для обратной связи: hr@relictum.pro
Все разработчики при работе с FMX рано или поздно сталкиваются с одной и той же проблемой: необходимо исключить «случайное» срабатывание нажатий элементов внутри скроллбокса во время его скроллинга. Идут годы, а решения так и нет. Давайте попробуем это исправить. Поехали!
Запускаем IDE, создаем новый проект, кидаем на форму TVertScrollBox и на него чего-нибудь побольше. запускаем на мобильном устройстве, пытаемся скроллировать,
получаем проблемы в виде срабатывания разных событий типа OnClick элементов.
Решение состоит в том, чтобы сделать элементы «невидимыми» для событий связанных с действиями пользователя с экраном во время скроллинга.
Делаем следующее:
Источник
Собираем показания датчиков
Общая информация
Датчики, следящие за физическими свойствами и состоянием окружающей среды, предоставляют инновационные способы для улучшения мобильных приложений. Наличие в современных телефонах электронных компасов, датчиков равновесия, яркости и близости открывает целый ряд новых возможностей для взаимодействия с устройством, таких как дополненная реальность и ввод данных, основанный на перемещениях в пространстве.
Датчики в Android делятся на несколько категорий: движения, положения и окружающей среды. Ниже перечислены некоторые виды популярных датчиков:
- Акселерометр (TYPE_ACCELEROMETER)
- Гироскоп (TYPE_GYROSCOPE)
- Датчик освещения (TYPE_LIGHT)
- Датчик расстояния (TYPE_PROXIMITY)
- Датчик магнитных полей (TYPE_MAGNETIC_FIELD)
- Барометр (TYPE_PRESSURE)
- Датчик температуры окружающей среды (TYPE_AMBIENT_TEMPERATURE)
- Измеритель относительной влажности (TYPE_RELATIVE_HUMIDITY)
В каждом телефоне может быть свой набор датчиков. В большинстве аппаратов есть — акселерометр и гироскоп.
Каждый из представленных датчиков заслуживает отдельной статьи. Имейте в виду, что существуют устаревшие классы для работы с датчиками, в частности, для датчиков ориентации и температуры.
Необходимо помнить несколько вещей, работая с датчиками:
- Показания бывают очень неровными. Вам нужно использовать какое-то среднее значение показаний, но не переборщить, чтобы приложение оставалось отзывчивым
- Данные приходят неравномерно. Не ждите спокойного, ровного потока данных
- Попробуйте предугадать будущие действия пользователя. Например, если идут данные о начале вращения устройства, можно предугадать следующее движение и подготовиться к нему
На эмуляторе практически невозможно тестировать работу с датчиками, поэтому используйте реальные устройства. В последних версиях эмуляторов список возможностей датчиков расширился. Смотрите в настройках эмулятора раздел Virtual sensors.
За работу с сенсорами отвечает класс SensorManager, содержащий несколько констант, которые характеризуют различные аспекты системы датчиков Android, в том числе:
Тип датчика Ориентация, акселерометр, свет, магнитное поле, близость, температура и т.д. Частота измерений Максимальная, для игр, обычная, для пользовательского интерфейса. Когда приложение запрашивает конкретное значение частоты отсчётов, с точки зрения сенсорной подсистемы это лишь рекомендация. Никакой гарантии, что измерения будут производиться с указанной частотой, нет. Точность Высокая, низкая, средняя, ненадёжные данные.
Типы датчиков
- TYPE_ACCELEROMETER — Измеряет ускорение в пространстве по осям X, Y, Z
- TYPE_AMBIENT_TEMPERATURE — Новый датчик для измерения температуры (API 14) в градусах Цельсия, который заменил устаревший TYPE_TEMPERATURE
- TYPE_GRAVITY — Трёхосевой датчик силы тяжести. Как правило, это виртуальный датчик и представляет собой низкочастотный фильтр для показаний, возвращаемых акселерометром
- TYPE_GYROSCOPE — Трёхосевой гироскоп, возвращающий текущее положение устройства в пространстве в градусах по трём осям. По другим данным, возвращает скорость вращения устройства по трём осям в радианах в секунду.
- TYPE_LIGHT — Измеряет степень освещённости. Датчик окружающей освещённости, который описывает внешнюю освещённость в люксах. Этот тип датчиков обычно используется для динамического изменения яркости экрана.
- TYPE_LINEAR_ACCELERATION — Трёхосевой датчик линейного ускорения, возвращающий показатели ускорения без учёта силы тяжести. Это виртуальный датчик, использующий показания акселерометра.
- TYPE_MAGNETIC_FIELD — Датчик магнитного поля, определяющий текущие показатели магнитного поля в микротеслах по трём осям.
- TYPE_ORIENTATION — Датчик ориентации. Измеряет повороты, наклоны и вращение устройства. Считается устаревшим
- TYPE_PRESSURE — Датчик атмосферного давления (барометр), возвращающий текущее давление в миллибарах. Можно определять высоту над уровнем моря, путём сравнения атмосферного давления в двух точках. Также барометры могут применяться для прогнозирования погоды.
- TYPE_PROXIMITY — Датчик приближённости, который сигнализирует о расстоянии между устройством и целевым объектом в сантиметрах. Каким образом выбирается объект и какие расстояния поддерживаются, зависит от аппаратной реализации данного датчика, возможно возвращение двух значений — Близко и Далеко. Типичное его применение — обнаружение расстояния между устройством и ухом пользователя для автоматического регулирования яркости экрана или выполнения голосовой команды.
- TYPE_RELATIVE_HUMIDITY — Датчик относительной влажности в виде процентного значения (API 14)
- TYPE_ROTATION_VECTOR — Возвращает положение устройства в пространстве в виде угла относительно оси. Виртуальный датчик, берущий показания от акселерометра и гироскопа. Также может использовать показания датчика магнитного поля
- TYPE_GEOMAGNETIC_ROTATION_VECTOR — альтернатива TYPE_ROTATION_VECTOR. Меньшая точность, но меньший расход батареи. Появился в Android 4.4 (API 19)
- TYPE_POSE_6DOF — ещё одна альтернатива TYPE_ROTATION_VECTOR. Появился в Android 7.0 (API 24)
- TYPE_SIGNIFICANT_MOTION — Появился в Android 4.3 (API 18)
- TYPE_MOTION_DETECT — детектор движения. Появился в Android 7.0 (API 24)
- TYPE_STATIONARY_DETECT — Появился в Android 7.0 (API 24)
- TYPE_STEP_COUNTER — датчик для подсчёта количества шагов
- TYPE_STEP_DETECTOR — определение начала шагов
- TYPE_HEART_BEAT — пульс. Появился в Android 7.0 (API 24)
- TYPE_HEART_RATE — сердечная активность. Появился в Android 4.4 (API 20)
- TYPE_LOW_LATENCY_OFFBODY_DETECT — Появился в Android 8.0 (API 26)
Кроме аппаратных датчиков, в устройствах используются виртуальные датчики, которые предоставляют упрощённые, уточнённые или комбинированные показания, используя комбинацию из нескольких аппаратных датчиков. В некоторых случаях этот способ удобнее.
Чтобы получить доступ к сенсорам, нужно вызвать метод getSystemService().
Устройство может включать в себя несколько реализаций одного и того же типа датчиков. Чтобы найти реализацию, используемую по умолчанию, вызовите метод getDefaultSensor() из объекта SensorManager, передавая ему в качестве параметра тип датчика в виде одной из констант, описанных выше.
Следующий фрагмент кода вернёт объект, описывающий гироскоп по умолчанию. Если для данного типа не существует датчика по умолчанию, будет возвращено значение null.
Таблица значений, возвращаемых датчиками
Тип датчика | Количество значений | Содержание значений | Примечание |
---|---|---|---|
TYPE_ACCELEROMETER | 3 | value[0]: ось X (поперечная) value[1]: ось Y (продольная) value[2]: ось Z (вертикальная) | Ускорение (м/с 2 ) по трём осям. Константы SensorManager.GRAVITY_* |
TYPE_GRAVITY | 3 | value[0]: ось X (поперечная) value[1]: ось Y (продольная) value[2]: ось Z (вертикальная) | Сила тяжести (м/с 2 ) по трём осям. Константы SensorManager.GRAVITY_* |
TYPE_RELATIVE_HUMIDITY | 1 | value[0]:относительная влажность | Относительная влажность в процентах (%) |
TYPE_LINEAR_ACCELERATION | 3 | value[0]: ось X (поперечная) value[1]: ось Y (продольная) value[2]: ось Z (вертикальная) | Линейное ускорение (м/с 2 ) по трём осям без учёта силы тяжести |
TYPE_GYROSCOPE | 3 | value[0]: ось X value[1]:ось Y value[2]: ось Z | Скорость вращения (рад/с) по трём осям |
TYPE_ROTATION_VECTOR | 4 | values[0]: x*sin(q/2) values[1]: y*sin(q/2) values[2]: z*sin(q/2) values[3]: cos(q/2) | Положение устройства в пространстве. Описывается в виде угла поворота относительно оси в градусах |
TYPE_MAGNETIC_FIELD | 3 | value[0]: ось X (поперечная) value[1]: ось Y (продольная) value[2]: ось Z (вертикальная) | Внешнее магнитное поле (мкТл) |
TYPE_LIGHT | 1 | value[0]: освещённость | Внешняя освещённость (лк). Константы SensorManager.LIGHT_* |
TYPE_PRESSURE | 1 | value[0]: атм.давление | Атмосферное давление (мбар) |
TYPE_PROXIMITY | 1 | value[0]: расстояние | Расстояние до цели |
TYPE_AMBIENT_TEMPERATURE | 1 | value[0]: температура | Температура воздуха в градусах по Цельсию |
TYPE_POSE_6DOF | 15 | см. документацию | |
TYPE_STATIONARY_DETECT | 1 | value[0] | 5 секунд неподвижен |
TYPE_MOTION_DETECT | 1 | value[0] | В движении за последние 5 секунд |
TYPE_HEART_BEAT | 1 | value[0] |
Огласите весь список, пожалуйста!
У класса SensorManager есть метод getSensorList(), позволяющий получить список доступных датчиков на устройстве через константу Sensor.TYPE_ALL и метод getName():
Так как у каждого устройства свой набор датчиков, то результаты будут у всех разными. Ниже приведены скриншоты с эмулятора и с реального устройства. В первом случае вывелось только 5 датчиков, во-втором было гораздо больше — вы видите только ту часть, которая поместилась на экране.
Также можно получить список доступных датчиков конкретного типа. В следующем фрагменте кода будут возвращены объекты Sensor, представляющие собой все доступные датчики давления:
Можно составить сложное условие, которое будет проверять производителя датчика и его версию. Если необходимого датчика не окажется, то выберем альтернативный вариант.
Интерфейс SensorEventListener — отслеживаем показания
Также вам понадобится интерфейс android.hardware.SensorListener. Интерфейс реализован с помощью класса, который используется для ввода значений датчиков по мере их изменения в режиме реального времени. Приложение реализует этот интерфейс для мониторинга одного или нескольких имеющихся аппаратных датчиков.
Интерфейс включает в себя два необходимых метода:
- Метод onSensorChanged(int sensor, float values[]) вызывается всякий раз, когда изменяется значение датчика. Этот метод вызывается только для датчиков, контролируемых данным приложением. В число аргументов метода входит целое, которое указывает, что значение датчика изменилось, и массив значений с плавающей запятой, отражающих собственно значение датчика. Некоторые датчики выдают только одно значение данных, тогда как другие предоставляют три значения с плавающей запятой. Датчики ориентации и акселерометр дают по три значения данных каждый.
- Метод onAccuracyChanged(int sensor,int accuracy) вызывается при изменении точности показаний датчика. Аргументами служат два целых числа: одно указывает датчик, а другое соответствует новому значению точности этого датчика.
Служба датчиков вызывает onSensorChanged() каждый раз при изменении значений. Все датчики возвращают массив значений с плавающей точкой. Размер массива зависит от особенностей датчика. Датчик TYPE_TEMPERATURE возвращает одно значение — температуру в градусах Цельсия, другие могут возвращать несколько значений. Вы можете использовать только нужные значения. Например, для получения сведений только о магнитном азимуте достаточно использовать первое числов, возвращаемое датчиком TYPE_ORIENTATION.
Параметр accuracy, используемый в методах для представления степени точности датчика, использует одну из констант
- SensorManager.SENSOR_STATUS_ACCURACY_LOW. Говорит о том, что данные, предоставляемые датчиком, имеют низкую точность и нуждаются в калибровке.
- SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM. Говорит о средней степени точности датчика и том, что калибровка может улучшить результат.
- SensorManager.SENSOR_STATUS_ACCURACY_HIGH. Показатели датчика точны настолько, насколько это возможно.
- SensorManager.SENSOR_STATUS_UNRELIABLE. Данные, предоставляемые датчиком, недостоверны. Это значит, что датчик необходимо откалибровать, иначе невозможно считывать результаты.
Чтобы получать события, генерируемые датчиками, зарегистрируйте свою реализацию интерфейса SensorEventListener с помощью SensorManager. Укажите объект Sensor, за которым вы хотите наблюдать, и частоту, с которой вам необходимо получать обновления.
После получения объекта вы вызываете метод registerListener() в методе onResume(), чтобы начать получать обновлённые данные, и вызываете unregisteredListener() в методе onPause(), чтобы остановить получение данных. В этом случае датчики будут использоваться только тогда, когда активность видна на экране.
В следующем примере показан процесс регистрации SensorEventListener для датчика приближенности по умолчанию с указанием стандартной частоты обновления:
Класс SensorManager содержит следующие константы для выбора подходящей частоты обновлений (в порядке убывания):
- SensorManager.SENSOR_DELAY_FASTEST — самая высокая возможная частота обновления показаний датчиков;
- SensorManager.SENSOR_DELAY_GAME — частота, используемая для управления играми;
- SensorManager.SENSOR_DELAY_NORMAL — частота обновлений по умолчанию;
- SensorManager.SENSOR_DELAY_UI — частота для обновления пользовательского интерфейса.
Выбранная вами частота необязательно будет соблюдаться. SensorManager может возвращать результаты быстрее или медленней, чем вы указали (хотя, как правило, это происходит быстрее). Чтобы минимизировать расход ресурсов при использовании датчиков в приложении, необходимо пытаться подбирать наиболее низкую частоту.
Динамические датчики
В Android 7.0 Nougat (API 24) появилось понятие динамических датчиков, рассчитанных на платформу Android Things. Датчики могут присоединяться и отсоединяться от платы в любое время.
Для определения доступных динамических датчиков используются методы isDynamicSensorDiscoverySupported(), isDynamicSensor(), getDynamicSensorList().
Момент присоединения или отсоединения датчика от платы можно отслеживать через класс SensorManager.DynamicSensorCallback.
Напоследок стоит упомянуть, что последние версии Android не позволяют получать данные с датчиков в фоне.
Источник