Гарантия того, что Android будет получать данные с датчиков

Разрабатываю приложение, отслеживающее поездки. Изучив этот вопрос, я пришел к выводу, что лучший способ добиться этого (постоянно отслеживать местоположение пользователя) - использовать службу переднего плана. В некоторых случаях работает довольно хорошо, но в некоторых других случаях (даже при выключенном DOZE) я получаю некоторые временные интервалы, в течение которых телефон полностью неподвижен, и я перестаю получать данные датчика (либо акселерометр, либо местоположения от поставщика объединенного местоположения).

Эта проблема усугубилась, когда я попробовал ее на устройстве Android 9 (я полагаю) из-за введенных им новых ограничений (отсутствие данных датчика, когда телефон находится в режиме ожидания и т. Д.). Чтобы решить эту проблему или, по крайней мере, попытаться уменьшить ее последствия, я подумал о реализации wakelock / job / alarm, чтобы срабатывать с 1-минутной частотой и ничего не делать. Это может быть действительно плохая идея, но я долго боролся с этим, я не знаю, что делать дальше.

Заранее большое спасибо!




Ответы (2)


Из вашего сообщения

Я получаю некоторые временные интервалы, в течение которых телефон полностью неподвижен, и я перестаю получать данные датчика (либо акселерометр, либо местоположения от поставщика объединенного местоположения).

Если телефон все еще работает, почему вы хотите получать данные о местоположении или датчиках в целях отслеживания?

person N0000B    schedule 24.01.2019
comment
Спасибо за быстрый ответ! Потому что иногда это приводит к одночасовому пробою в пробах. Есть виды транспорта, в которых ускорение действительно около 0 м / с. - person Poider12; 24.01.2019
comment
Я думаю, что вам нужно специальное / специально созданное устройство, если вы не хотите, чтобы в образцах данных были какие-либо дыры. Есть несколько компаний по отслеживанию, которые предоставляют информацию о местоположении в реальном времени, обычно поставляются с небольшим выделенным устройством (я думаю, под управлением Android или какой-то разновидности Linux). Если вам абсолютно необходимо получать данные о местоположении каждую минуту, вы можете настроить будильник, чтобы разбудить устройство. Недостатком является то, что на панели уведомлений всегда будет отображаться маленький значок (будильник), а ежеминутное пробуждение устройства также потребляет значительный заряд батареи. - person N0000B; 24.01.2019
comment
Еще раз большое спасибо за ответ! Будет ли он потреблять много, если это просто сигнал тревоги, который будит процессор, но ничего не делает? У вас есть рекомендации, как это реализовать? - person Poider12; 25.01.2019
comment
Насколько я понимаю, пробуждение ЦП по срабатыванию тревоги не только разбудит ЦП, но и все радио, например. Wi-Fi / данные также включены. И когда это произойдет, любое приложение (не только ваше приложение), ожидающее сети, также будет пробуждено для выполнения любого ожидающего ввода-вывода. Таким образом, это определенно разрядит значительный объем батареи, и если вы спросите меня, я определенно посоветую не выводить устройство из спящего режима. Кстати, что именно ты делаешь с данными о местоположении? - person N0000B; 27.01.2019
comment
Приложение должно отслеживать все поездки пользователя. Я использую акселерометр с частотой дискретизации 1 с, чтобы подтвердить, когда пользователь (вероятно) начал ездить на работу. Когда приложение подозревает, что пользователь переместился (вычисляя среднее ускорение за последний 10-секундный интервал), оно включает провайдер объединенного местоположения и начинает сбор местоположений. Если пользователь покидает радиус 100 метров, мы подтверждаем, что пользователь начал поездку, и поэтому начинаем сохранять эти местоположения до конца поездки, что соответствует остановке пользователя на месте (или в 100 метрах вокруг него) на 30 минут. . - person Poider12; 28.01.2019
comment
Если это корпоративное или какое-то приложение для отслеживания автопарка для целей отслеживания, тогда имеет смысл настроить будильник, чтобы получать последнюю выборку данных через определенный интервал, и пользователи могут быть в порядке с использованием батареи (устройство может быть подключено всегда). - person N0000B; 28.01.2019

Используйте WakeLock. Это его прямое предназначение.

ИЗМЕНИТЬ

Чтобы уточнить: ваше устройство, скорее всего, прекращает сбор данных, потому что оно переходит в спящий режим. При некоторых обстоятельствах такое поведение может быть связано с Doze, но вы упомянули, что используете службу переднего плана. Согласно комментарию Дайанн Хакборн в этом сообщении, приложения с запущенными службами переднего плана не ограничен Doze. И, согласно документам, WakeLocks являются подходящим методом удержания устройства в активном состоянии.

person greeble31    schedule 24.01.2019