Comment demander des permissions à un service dans Android Marshmallow

Dans Android Marshmallow, les permissions doivent être demandées au moment de l’exécution, au lieu d’être réunies lorsqu’une application est installée. Cependant, je ne peux que sembler demander des permissions à une activité, ce qui est un problème car mon application ne contient que des services. (Pourquoi est-ce possible? L’application dispose d’un cadran Android Wear intégré, et tout ce que fait le téléphone est de rechercher des photos à proximité pour les envoyer à la montre – aucune activité requirejse. Mais cela nécessite des permissions de localisation.)

Existe-t-il un moyen de demander des permissions à un service? Ou forcer les permissions à être accordées au moment de l’installation comme par le passé?

    requestPermission() ne peut être appelée qu’à partir d’une Activity et non d’un Service (contrairement à checkPermission() qui ne nécessite que PackageManager ). Vous devez donc faire un travail supplémentaire pour contourner ce problème; vous devez fournir une Activity dans votre application et, par exemple, votre Service peut vérifier les permissions dont il a besoin et s’il n’a pas encore été accordé, il peut créer une notification et informer l’utilisateur d’un court message expliquant pourquoi il y a une notification et ce qui doit arriver quand ils cliquent sur la notification, etc.

    Je suis d’accord, c’est très gênant pour les services, je pense que vous devriez signaler un problème sur la page de prévisualisation Android Developer pour cela.

    Pour le moment, je pense que la meilleure solution consiste à vérifier les permissions sur le service et à afficher une notification si l’autorisation est manquante. Mieux encore, créez un DialogActivity pour demander l’autorisation lorsque les utilisateurs appuient sur la notification.

    Jetez un coup d’œil à la bibliothèque PermissionEverywhere . Il vous permet de demander la permission de n’importe quel contexte.

    Il crée une notification en cliquant sur ce qui ouvre une activité demandant une autorisation.

    Exemple de code de la page github de la bibliothèque: –

     @Override protected Boolean doInBackground(Void... params) { PermissionResponse response = PermissionEverywhere.getPermission(getApplicationContext(), new Ssortingng[]{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 } } 

    Il existe une bibliothèque très simple qui permet de faire exactement cela. Vous pouvez vérifier les permissions depuis n’importe quel endroit (même depuis un service), selon que l’application est en avant-plan ou en arrière-plan, qu’elle affiche un dialog normal ou génère une notification demandant des permissions. Le code est très simple à comprendre et facile à utiliser.

    Essayez-le: Autorisations Android

     @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() {....} } 

    Vous pouvez utiliser ResultReceiver pour créer un récepteur de la réponse de l’utilisateur, puis le transmettre en tant que rappel à l’activité, via PendingIntent de notification. Référence