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.
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);
}
}
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 retournePERMISSION_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)