2016-03-11 3 views
0

У меня есть приложение, которое прослушивает широковещательную передачу android.location.PROVIDERS_CHANGED, чтобы не забывать о текущих возможностях местоположения телефона.Marshmallow приложение-разрешение: android.location.PROVIDERS_CHANGED не увольняется

С Android M и новыми разрешениями на выполнение приложений он работает нормально, когда местоположение изменяется с системной/общей панели. Но если пользователь отключает разрешение местоположения специально для приложения, такая же трансляция не запускается.

Пока я могу проверить доступ к местоположению с помощью обычного AlarmManager, но это довольно странно и не очень отзывчиво.

Есть ли какой-либо другой конкретный метод, в идеале такой тип BroadcastReceiver для регистрации, который информирует нас об этом изменении разрешения на использование приложения с Android M?

+0

Попробуйте это, возможно, это работа http://stackoverflow.com/a/41221852/5488468 –

ответ

2

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

Если пользователь отменяет разрешение, процесс вашего приложения будет прекращен. Идея состоит в том, что вы узнаете об отозванном разрешении, когда ваше приложение снова запустится, и вы вызываете checkSelfPermission(). Этот поток оптимизирован для более обычных случаев, когда проверки разрешений ведутся в активности, открытой пользователем. Он не очень хорошо обрабатывает ваш случай (хотя IMHO, разрешения на размещение не должны влиять на трансляцию, как вы описали).

В N Developer Preview вы можете настроить JobScheduler для контроля за Uri за изменения и активировать работу по мере необходимости. Это немного похоже на регистрацию ContentObserver, за исключением того, что вы не нуждаетесь в непрерывном запуске процесса. — JobScheduler регистрирует наблюдателя и просто вызывает ваш JobService по мере необходимости. I думаю, что список источников с включенными источниками находится где-то в провайдере Settings; если это так, для Android 6.1/7.0/Turbo System 5000/независимо от того, что N включает, вы можете использовать JobScheduler, чтобы узнать об изменениях источника местоположения, а не полагаться на трансляцию.

Это не поможет вам для Android 6.0. Вы можете использовать JobScheduler или AlarmManager или что-то посмотреть, если вы потеряли разрешение (через checkSelfPermission()), но это своего рода расточительное время автономной работы (и, как результат, не будет работать должным образом в режиме «Дозировка» и, возможно, в режиме ожидания приложения).

+1

Благодарим вас за эти разъяснения – JBA

Смежные вопросы