ubicacion - Cómo solicitar permisos de un Servicio en Android Marshmallow
request permission android studio (6)
Echa un vistazo a la biblioteca PermissionEverywhere . Le permite solicitar permiso de cualquier contexto.
Crea una notificación haciendo clic en el que abre una actividad solicitando un 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
}
}
En Android Marshmallow, los permisos se deben solicitar 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 contiene solo Servicios. (¿Por qué es eso, 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 requiere permisos de ubicación).
Entonces, ¿hay alguna forma de solicitar permisos de un Servicio? ¿O de alguna manera obligar a que se otorguen los permisos al momento de la instalación como en el pasado?
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 de 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.
Hay 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 solicitando permisos. El código es realmente fácil de entender y también es muy fácil de usar.
Pruébalo: permisos de Android
Puede usar
ResultReceiver
para crear un receptor de la respuesta de los usuarios y luego pasarlo como devolución de llamada a la Actividad, a través del
PendingIntent
la notificación.
PermissionEverywhere
requestPermission()
solo se puede llamar desde una
Activity
y no desde un
Service
(a diferencia de
checkPermission()
que solo requiere
PackageManager
).
Por lo tanto, debe hacer un trabajo extra para evitar eso;
debe proporcionar una
Activity
en su aplicación y, por ejemplo, su
Service
puede verificar los permisos que necesita y, si aún no se han otorgado, puede crear una notificación y puede informar al usuario con un breve mensaje descriptivo de por qué hay una notificación y lo que debe suceder cuando hacen clic en la notificación, etc.
@SuppressLint("NewApi")
public void checkPerm()
{
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
if ( checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {
return;
}
locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, new LocationListener() {....}
}