Android не выходит из режима ожидания при перемещении с устройством
Итак, некоторые предпосылки, я разрабатываю приложение отслеживания местоположения. У меня запущена служба, которая получает обновления GPS с помощью провайдера слияния местоположения. Когда приложение закрыто или устройство заблокировано, моя служба перемещается на передний план. Он также использует частичную блокировку и включен в белый список.
У меня сложилось впечатление, что устройство должно выйти из режима ожидания, если оно движется. Как указано в этом ответе здесь. Однако я вижу противоречивые результаты на разных устройствах. У меня есть три тестовых устройства. Sony Experia, Moto E4 Plus и Nexus 5x. Приложение прекрасно работает на Sony и Nexus. Я оставляю его бездействующим, включается режим дозирования, а затем, когда я перемещаю устройство, он выходит из режима дозирования, и обновления gps запускаются снова. И это здорово, потому что мне не нужны обновления GPS, когда устройство неподвижно, это просто тратит время автономной работы. Просто для ясности, разные версии Android для каждого устройства:
Sony Xperia: 7.0
Moto E4 plus: 7.1.1
Nexus 5X: 8.0
Проблема с мото, я оставляю устройство, чтобы войти в режим ожидания. Однако, подняв его и двигаясь с ним, он не выходит из режима ожидания. Выход из режима ожидания возможен только при некотором взаимодействии с пользователем. Просматривая другие ответы и документацию по Android, я прав, полагая, что перемещение устройства всегда должно приводить к его существованию в режиме ожидания. Если это так, может ли это быть проблемой аппаратного обеспечения, или OEM-производитель может изменить режим работы дремоты?
Спасибо за любую помощь.
2 ответа
Таким образом, Android должен быть в состоянии обнаружить движение, чтобы выйти из режима ожидания. На мотоцикле нет гироскопа. Это останавливает обнаружение движения и выход из режима ожидания.
Чтобы эта функция работала, производитель должен был внедрить «датчик значительного движения». Вы можете проверить, доступен ли этот датчик, спросив, существует ли этот датчик: «android.sensor.significant_motion».
SensorManager mSensorManager = (SensorManager) mContext.getSystemService(Service.SENSOR_SERVICE);
boolean isSensorPresent = mSensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION) != null;
Кроме того, некоторые производители обходят правила режима Doze с помощью собственной системы управления питанием. Например, это относится к некоторым телефонам производства Huawei и Xiaomi. В этих случаях можно остановить систему управления питанием производителя, чтобы приостановить работу вашего приложения. Но это должно быть сделано пользователем вручную.