Android: обходной путь для срабатывания датчика освещенности при каждом нажатии кнопки питания?

Я работаю над приложением для Android, которое отключает экран устройства, когда значение датчика освещенности ниже порогового значения, и снова включает экран, когда значение датчика освещенности превышает пороговое значение. Это пороговое значение определяется пользователем посредством однократной калибровки. Все работает отлично, экран включается и выключается, когда положено, и я справился с постоянными колебаниями значений датчика освещенности, чтобы экран не включался и не выключался случайным образом.

Проблема, с которой я сталкиваюсь, заключается в том, что при нажатии кнопки питания по какой-то причине запускается событие «onSensorChanged» датчика освещенности. Это означает, что если пользователь нажмет кнопку питания, чтобы выключить экран, он автоматически снова включится, если он находится в правильном освещении.

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

Есть ли другое возможное (возможно, более логичное) решение этой проблемы?

Я не думаю, что было бы полезно опубликовать код, но дайте мне знать, если вам нужно, чтобы я его опубликовал.

Спасибо.


person Jasjit Singh Marwah    schedule 25.07.2013    source источник


Ответы (1)


Почему бы не отслеживать флаг нажатия кнопки питания, когда вы ее отключаете? Таким образом, если он был отключен по какой-либо другой причине, он ничего не сделает.

Редактировать: Еще одна идея...

Что вы можете сделать, так это отследить последний раз, когда было запущено намерение ACTION_SCREEN_OFF. Если время меньше определенного порога (0,05 с?) с момента вызова вашего onSensorChanged, вы можете просто игнорировать (или, по крайней мере, не включать его снова включить).

person Geobits    schedule 25.07.2013
comment
Спасибо за ответ. Я думал об этом, но использовал бы его только в крайнем случае, ради пользователя. У людей есть привычка нажимать кнопку питания, а затем совать свой телефон в карман (что в любом случае выключит экран, я знаю, но пользователи склонны придираться). Однако, когда они вернут его обратно, экран должен снова включиться. Это работает, если я использую датчик приближения, потому что кнопка питания не вызывает его onSensorChanged. Насколько я могу судить, эта кнопка — единственная вещь (кроме света), которая запускает датчик освещенности, поэтому мне нужно беспокоиться только об этой кнопке. - person Jasjit Singh Marwah; 25.07.2013
comment
Я понимаю, что вы имеете ввиду. Из любопытства, почему тогда ты не используешь датчик приближения? Может быть, датчик освещенности должен быть запасным вариантом для устройств без датчиков приближения? - person Geobits; 25.07.2013
comment
Датчик по умолчанию для моего приложения — это датчик приближения. Действительно, датчик освещенности — это всего лишь запасной вариант (у большинства планшетов нет датчика приближения) и приятная дополнительная функция (поскольку некоторые люди сообщают о снижении расхода заряда батареи при использовании датчика освещенности). Дело в том, что, хотя это и запасной вариант, я хочу, чтобы он работал так же хорошо (и таким же образом), как и датчик приближения, и, к моему удивлению, он работал прекрасно! Никогда бы не догадался, насколько ужасна автояркость в моем Note, но какая радость наблюдать за тем, как она творит чудеса в моем приложении... за исключением этой довольно надоедливой и неожиданной проблемы. - person Jasjit Singh Marwah; 25.07.2013
comment
Имеет смысл. Отредактированный ответ. - person Geobits; 25.07.2013
comment
Ах, так вы имеете в виду, что всякий раз, когда вызывается onSensorChanged, проверяйте, был ли экран только что выключен (например, 0,05 с назад), и в этом случае не включайте его снова (игнорируйте его)? Думаю, мне придется зарегистрировать BroadcastReceiver и отслеживать системное время всякий раз, когда срабатывает Intent. Надеюсь, Android облегчит мне жизнь и активирует этот Intent перед вызовом onSensorChanged, но в остальном это кажется правдоподобным решением. Я попробую, как только смогу! Спасибо! - person Jasjit Singh Marwah; 25.07.2013