В Android Marshmallow разрешения следует запрашивать во время выполнения, когда они необходимы, а не все сразу при установке приложения. Однако я могу запрашивать разрешения только у Activity, что является проблемой, поскольку мое приложение содержит только Services. (Почему это так, вы можете спросить? В приложение встроен циферблат Android Wear, и все, что делает телефон, - это искать фотографии поблизости и отправлять их на часы - никаких действий не требуется. Но для этого требуется разрешение на определение местоположения.)
Итак, есть ли способ запросить разрешения у службы? Или как-то принудительно выдавать разрешения во время установки, как раньше?
android
wear-os
android-permissions
android-6.0-marshmallow
Тони Уикхэм
источник
источник
Ответы:
requestPermission()
может вызываться только из,Activity
а не изService
(в отличие отcheckPermission()
этого только требуетPackageManager
). Так что вам нужно проделать дополнительную работу, чтобы обойти это; вам нужно указатьActivity
в своем приложении, и, например, выService
можете проверить необходимые разрешения, и если они еще не предоставлены, он может создать уведомление и сообщить пользователю короткое описательное сообщение о том, почему существует уведомление и что должно произойти, когда они нажимают на уведомление и т. д.источник
Context
который также реализуетOnRequestPermissionsResultCallback
. Функциональность аналогична стандартнойrequestPermission()
.Я согласен, это очень проблематично для служб, я думаю, вам следует сообщить о проблеме на странице предварительного просмотра Android Developer Preview.
На данный момент я думаю, что лучшим решением является проверка разрешения на сервис и отображение уведомления, если разрешение отсутствует. Более того, создайте DialogActivity для запроса разрешения, когда пользователи нажимают на уведомление.
источник
Взгляните на библиотеку PermissionEverywhere . Это позволяет вам запрашивать разрешение из любого контекста.
Он создает уведомление, при нажатии на которое открывается действие, запрашивающее разрешение.
Пример кода со страницы библиотеки на github: -
источник
PermissionEverywhere
, убедитесь, что вы объявляете вспомогательную активность в своем манифесте И убедитесь, что при ее объявлении она привязана к правильному пакету (если вы используетеPermissionEverywhere
как отдельный пакет). Мне потребовалось много времени, чтобы понять, что на самом деле я не указывалPermissionEverywhere
пакет в манифесте.PermissionEverywhere
демонстрационное приложение, но оно не сработало.Есть очень простая библиотека, которая позволяет делать именно это. Вы можете проверить разрешения из любого места (даже из службы), в зависимости от того, находится ли приложение на переднем плане или в фоновом режиме, оно либо показывает обычный диалог, либо генерирует уведомление с запросом разрешений. Код действительно прост для понимания и очень прост в использовании.
Попробуйте: разрешения Android
источник
Вы можете использовать
ResultReceiver
для создания получателя ответа пользователя, а затем передать его как обратный вызов Activity через уведомленияPendingIntent
. Ссылкаисточник