web-dev-qa-db-fra.com

Comment demander des autorisations à un service dans Android Marshmallow

Dans Android Marshmallow, les autorisations doivent être demandées au moment de l'exécution, au besoin, plutôt que toutes les autorisations en même temps lorsqu'une application est installée. Cependant, je ne peux apparemment que sembler demander des autorisations à une activité, ce qui pose un problème car mon application ne contient que des services. (Pourquoi, demandez-vous? L'application dispose d'un Android. Le visage de la montre est emballé à l'intérieur, et tout le téléphone ne cherche que des photos à proximité à envoyer à la montre - aucune activité n'est nécessaire. autorisations de localisation.)

Alors, est-il possible de demander des autorisations à un service? Ou forcer d'une manière ou d'une autre les autorisations à être accordées au moment de l'installation, comme par le passé?

96
Tony Wickham

requestPermission() ne peut être appelé qu'à partir d'un Activity et non d'un Service (contrairement à checkPermission() qui ne nécessite que PackageManager). Vous devez donc faire un travail supplémentaire pour résoudre ce problème. vous devez fournir un Activity dans votre application et, par exemple, votre Service peut vérifier les autorisations nécessaires et, le cas échéant, créer une notification et en informer l'utilisateur. avec un court message descriptif expliquant pourquoi il y a notification et ce qui doit se passer quand ils cliquent sur la notification, etc.

41
Ali Naddaf

Je conviens que cela est très gênant pour les services. Je pense que vous devriez signaler un problème sur la page Android Developer Preview.

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

14
Derek Fung

Regardez PermissionEverywhere library. 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 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
      }
  }
7
Heisenberg

Il existe une bibliothèque très simple qui permet de faire exactement cela. Vous pouvez vérifier les autorisations de n'importe où (même d'un service), que l'application soit au premier plan ou à l'arrière-plan, affiche une boîte de dialogue normale ou génère une notification demandant des autorisations. Le code est très facile à comprendre et à utiliser.

Faites un essai: Autorisations Android

2
Nishkarsh
@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() {....}
}
0
Thamsanqa Mahlaola