web-dev-qa-db-fra.com

Demander les autorisations de localisation à partir d'un service Android M

J'utilise un service qui au démarrage démarre et commence à vérifier les mises à jour d'emplacement. Une fois que je refuse l’accès à la localisation via le popup de permission maintenant grâce à Android), mon service se bloque lorsque le téléphone s’amorce.

Comme je n'ai aucune activité dans ce cas, l'appel à requestPermissions() renvoie un ClassCastException car mon service Context ne peut pas être converti en activité.

Mon appel de méthode:

ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION);

Existe-t-il une solution jusqu'ici OR Dois-je révoquer les droits de service pour NE PAS fonctionner dans un tel état.

37
stud91

Vous ne pouvez pas demander d'autorisation via un service, puisqu'un service n'est pas lié à une interface utilisateur, cela a du sens. Puisqu’un contexte de service n’est pas une activité, l’exception que vous obtenez est logique.

Vous pouvez vérifier si l'autorisation est disponible dans un service et demander l'autorisation dans une activité (oui vous avez besoin d'une activité).

Dans un service:

 public static boolean checkPermission(final Context context) {
return ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
        && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;
 }

et dans une activité:

private void showPermissionDialog() {
    if (!LocationController.checkPermission(this)) {
        ActivityCompat.requestPermissions(
            this,
            new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION},
            PERMISSION_LOCATION_REQUEST_CODE);
    }
}
45
Joakim Engstrom

Vous pouvez vérifier les autorisations sans Activity en utilisant le contexte d'application, mais vous aurez besoin d'Activity pour demander des autorisations. Pour obtenir le contexte d'application, appelez simplement getApplicationContext() et vérifiez les autorisations, utilisez plutôt ContextCompat.checkSelfPermission().

Il existe également de bonnes informations sur l'utilisation des autorisations d'exécution dans méthode correcte :

Pour vérifier si vous avez une permission, appelez la méthode ContextCompat.checkSelfPermission(). Par exemple, cet extrait montre comment vérifier si l'activité est autorisée à écrire dans le calendrier:

// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
        Manifest.permission.WRITE_CALENDAR);

Si l'application a l'autorisation, la méthode retourne PackageManager.PERMISSION_GRANTED, et l'application peut poursuivre l'opération. Si l'application ne dispose pas de l'autorisation, la méthode retourne PERMISSION_DENIED, et l'application doit explicitement demander l'autorisation à l'utilisateur.

Modifier: après avoir vérifié les autorisations sur le service, vous aurez besoin de Activity pour demander une autorisation:

public static void requestPermissions (Activity activity, String[] permissions, int requestCode)
10
Vitaliy A