web-dev-qa-db-fra.com

Android 6.0 permission.GET_ACCOUNTS

J'utilise ceci pour obtenir la permission:

if (ContextCompat.checkSelfPermission(context, Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(context, Manifest.permission.GET_ACCOUNTS)) {

    } else {
        // No explanation needed, we can request the permission.
        ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.GET_ACCOUNTS}, PERMISSIONS_REQUEST_GET_ACCOUNTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

Mais la boîte de dialogue contextuelle d'autorisation demande à l'utilisateur d'accéder aux contacts!?!?

En pré 6.0 dans Play Store avec 

<uses-permission Android:name="Android.permission.GET_ACCOUNTS"/>

la requête s'appelle Identity et explique que j'en ai besoin pour obtenir un compte d'appareil. 

34
SpyZip

C'est à cause des groupes de permission. Fondamentalement, les autorisations sont placées dans différents groupes et toutes les autorisations de ce groupe seraient accordées si l’un d’eux était accordé. 

Par exemple. Sous "Contacts", il y a des contacts en écriture/lecture et obtenir des comptes. Ainsi, lorsque vous demandez l'un de ces contacts, la fenêtre contextuelle demande les autorisations de contacts.

Lisez à travers: Tout ce que chaque développeur Android doit savoir sur la nouvelle autorisation d'exécution d'Android


EDIT 1

Je pensais juste que j'ajouterais les informations associées (pas pour obtenir des comptes, mais des autorisations et des groupes): informations de mise à jour Oreo:
source: https://developer.Android.com/about/versions/oreo/Android-8.0-changes.html#rmp

Avant Android 8.0 (API de niveau 26), si une application demandait une autorisation au moment de l'exécution et lorsque l'autorisation a été accordée, le système est également incorrect. accordé à l'application le reste des autorisations ayant appartenu à la même groupe de permission, et qui ont été enregistrés dans le manifeste.

Pour les applications ciblant Android 8.0, ce problème a été corrigé. Le Seules les autorisations explicitement demandées sont accordées à app . Cependant, une fois que l'utilisateur accorde une autorisation à l'application, tous les suivants les demandes d'autorisations dans ce groupe d'autorisations sont automatiquement accordé.


31
Pararth

GET_ACCOUNTS a été déplacé dans le groupe de permissions CONTACTS dans Android 6.0 . Bien que l'API nous ait fourni des autorisations, l'utilisateur (pour Android 6.0 au moins) est invité à entrer des groupes d'autorisations. Par conséquent, l'utilisateur recevra le même message d'invite pour GET_ACCOUNTS qu'il obtiendrait pour READ_CONTACTS ou WRITE_CONTACTS.

18
CommonsWare

Heureusement, cela va changer dans Android N 

http://developer.Android.com/preview/behavior-changes.html#perm

L'autorisation GET_ACCOUNTS est maintenant obsolète. Le système ignore ceci autorisation pour les applications qui ciblent Android N.

6
ibmkhd

Dans Marshmallow, toutes les autorisations dangereuses appartiennent à des groupes d'autorisations. 

La permission Android.permission.GET_ACCOUNTS appartient à CONTACTS groupe 

Vous pouvez trouver plus d'informations sur les permissions dangereuses et leurs groupes ici:
https://developer.Android.com/guide/topics/security/permissions.html#normal-dangerous

2
Mattia Maestrini

Je me suis d'abord trompé de question. Sur cette page http://developer.Android.com/guide/topics/security/permissions.html#perm-groups , vous pouvez voir que GET_ACCOUNTS fait référence aux contacts du groupe de permissions. Pour cette raison, vous êtes invité à demander une autorisation de contact.

1
Thomas R.

Si vous utilisez l'autorisation GET_ACCOUNTS pour demander à l'utilisateur de sélectionner un type de compte particulier sur l'appareil (Google dans mon cas), vous pouvez utiliser la classe AccountPicker qui ne nécessite aucune autorisation spéciale.

Intent intent = AccountPicker.newChooseAccountIntent(null, null,
                    new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE},
                    false, null, null, null, null);
try {
    startActivityForResult(intent, REQUEST_ACCOUNT_PICKER);
} catch (ActivityNotFoundException e) {
    // This device may not have Google Play Services installed.
}

Vous aurez besoin de l’authentification des services Google Play dans vos dépendances.

implementation com.google.Android.gms:play-services-auth:16.0.1

Cela évite le popup d'autorisation de contacts pour moi

0
Jer