En Android Marshmallow, los permisos deben solicitarse en tiempo de ejecución cuando se necesitan, en lugar de todos a la vez cuando se instala una aplicación. Sin embargo, parece que solo puedo solicitar permisos de una actividad, lo cual es un problema ya que mi aplicación solo contiene servicios. (¿Por qué, podrías preguntar? La aplicación tiene una esfera de reloj Android Wear incluida en el interior, y todo lo que hace el teléfono es buscar fotos cercanas para enviarlas al reloj, no se necesita actividad. Pero sí requiere permisos de ubicación).
Entonces, ¿hay alguna forma de solicitar permisos a un Servicio? ¿O de alguna manera obligar a que se otorguen los permisos en el momento de la instalación como en el pasado?
android
wear-os
android-permissions
android-6.0-marshmallow
Tony Wickham
fuente
fuente
Respuestas:
requestPermission()
solo se puede llamar desde unaActivity
y no aService
(a diferencia decheckPermission()
que solo requierePackageManager
). Así que necesitas hacer un trabajo extra para solucionarlo; debe proporcionar unActivity
en su aplicación y, por ejemplo,Service
puede verificar los permisos que necesita y, si aún no se han otorgado, puede crear una notificación y eso puede informar al usuario con un mensaje corto descriptivo de por qué hay una notificación y lo que debe suceder cuando hacen clic en la notificación, etc.fuente
Context
que también implementeOnRequestPermissionsResultCallback
. La funcionalidad es similar a la estándarrequestPermission()
.Estoy de acuerdo, esto es muy problemático para los servicios, creo que debería informar un problema en la página de Vista previa del desarrollador de Android para esto.
Por el momento, creo que la mejor solución es verificar el permiso en el servicio y mostrar una notificación si falta el permiso. Aún mejor, cree una DialogActivity para solicitar permiso cuando los usuarios presionen la notificación.
fuente
Eche un vistazo a PermissionEverywhere biblioteca de . Te permite solicitar permiso desde cualquier contexto.
Crea una notificación haciendo clic en la que abre una actividad pidiendo permiso.
Código de muestra de la página de github de la biblioteca: -
fuente
PermissionEverywhere
, asegúrese de declarar la actividad de ayuda en su manifiesto Y asegúrese de que cuando la declare, esté vinculada al paquete correcto (si lo está usandoPermissionEverywhere
como un paquete separado). Me tomó mucho tiempo darme cuenta de que en realidad no estaba especificando elPermissionEverywhere
paquete en el manifiesto.PermissionEverywhere
's aplicación de demostración y no funcionó.Existe una biblioteca muy simple que permite hacer exactamente esto. Puede verificar los permisos desde cualquier lugar (incluso desde un servicio), en función de si la aplicación está en primer plano o en segundo plano, muestra un diálogo normal o genera una notificación que solicita permisos. El código es realmente fácil de entender y también es muy fácil de usar.
Pruébelo: permisos de Android
fuente
Puede usar
ResultReceiver
para crear un receptor de la respuesta de los usuarios, luego pasarlo como devolución de llamada a la Actividad, a través de notificacionesPendingIntent
. Referenciafuente