Cómo solicitar permisos de un servicio en Android Marshmallow

101

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?

Tony Wickham
fuente
este problema también dentro de la clase de aplicación
itzhar
Pruebe esto, puede ser trabajo stackoverflow.com/a/41221852/5488468
Bipin Bharti
Mi biblioteca maneja los permisos de tiempo de ejecución fácilmente desde cualquier contexto y también maneja "No preguntar de nuevo". github.com/nabinbhandari/Android-Permissions
Nabin Bhandari

Respuestas:

47

requestPermission()solo se puede llamar desde una Activityy no a Service(a diferencia de checkPermission()que solo requiere PackageManager). Así que necesitas hacer un trabajo extra para solucionarlo; debe proporcionar un Activityen su aplicación y, por ejemplo, Servicepuede 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.

Ali Naddaf
fuente
Esta es la solución que propuso Benjamin Poiesz . Puede escuchar este podcast desde las 23:40
xiaomi
También puede llamar a requestPermission () dentro del fragmento.
Misagh Emamverdi
3
¿Cuál es la solución para el caso de un servicio en segundo plano en ejecución que verifica periódicamente las actualizaciones de ubicación y simplemente desactivo el permiso de ubicación en la configuración? Como no hay actividad, mi servicio se
bloquea
1
@ stud91 Como mínimo, detecta excepciones de seguridad o permisos de consulta cada vez que solicites actualizaciones de ubicación. Esto evitará que su aplicación se bloquee (aunque no obtendrá ninguna ubicación si el permiso ha sido revocado). Aún mejor: verifique el permiso y, si falta, muestre una notificación que lleve al usuario a una Actividad que es solo un marcador de posición para el cuadro de diálogo de permisos.
user149408
8
Así es como lo resolví: github.com/mvglasow/satstat/blob/master/src/com/vonglasow/… Se puede llamar desde cualquiera Contextque también implemente OnRequestPermissionsResultCallback. La funcionalidad es similar a la estándar requestPermission().
user149408
15

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.

Derek Fung
fuente
7

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: -

@Override
  protected Boolean doInBackground(Void... params) {
      PermissionResponse response = PermissionEverywhere.getPermission(getApplicationContext(), 
      new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
              REQ_CODE,
              "Notification title", 
              "This app needs  a write permission", 
              R.mipmap.ic_launcher)
              .call();
      //waits..
      boolean isGranted = response.isGranted();

      if(isGranted){ //changed from isGrante to isGranted
      // Do stuff
      }
  }
Heisenberg
fuente
1
Probé la versión asíncrona en un servicio y no funcionó. onComplete nunca se ha llamado
Leo Droidcoder
Buena idea, pero no está disponible en el repositorio
naXa
2
Este paquete funcionó para mí, gracias por la sugerencia. Sin embargo, me gustaría señalar que no probé la versión asincrónica. Además, para aquellos que tienen problemas con el uso 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á usando PermissionEverywherecomo un paquete separado). Me tomó mucho tiempo darme cuenta de que en realidad no estaba especificando el PermissionEverywherepaquete en el manifiesto.
usuario3570982
Corrí PermissionEverywhere's aplicación de demostración y no funcionó.
Ixx
2

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

Nishkarsh
fuente
-2

Puede usar ResultReceiverpara crear un receptor de la respuesta de los usuarios, luego pasarlo como devolución de llamada a la Actividad, a través de notificaciones PendingIntent. Referencia

Farrux Bahodirov
fuente