it-swarm-eu.dev

Autorizzazione Android 6.0.GET_ACCOUNTS

Sto usando questo per ottenere il permesso:

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.
    }
}

Ma la finestra di dialogo di pop-up per l'autorizzazione chiede all'utente per l'accesso Contatti!?!?

In pre 6.0 in Play Store con 

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

la richiesta è denominata Identity e spiega che ne ho bisogno per ottenere l'account del dispositivo. 

34
SpyZip

Questo a causa dei gruppi di permessi. Fondamentalmente, le autorizzazioni sono collocate in gruppi diversi e tutte le autorizzazioni da quel gruppo sarebbero concesse se una di esse fosse concessa. 

Per esempio. Sotto "Contatti", c'è la possibilità di scrivere/leggere i contatti e ottenere gli account, quindi quando ne chiedi uno di questi, il popup chiede le autorizzazioni di Contatti.

Leggi attentamente: Tutto ciò che ogni Sviluppatore Android deve conoscere sulla nuova autorizzazione di runtime di Android


EDIT 1

Ho solo pensato di aggiungere i relativi (non per ottenere account ma permessi e gruppi) Oreo aggiornare le informazioni:
source: https://developer.Android.com/about/versions/oreo/Android-8.0-changes.html#rmp

Prima di Android 8.0 (livello API 26), se un'app richiedeva un'autorizzazione in fase di esecuzione e il permesso è stato concesso, anche il sistema in modo errato concesso all'app il resto delle autorizzazioni che appartenevano allo stesso gruppo di autorizzazioni e che sono stati registrati nel manifest.

Per le app che hanno come target Android 8.0, questo comportamento è stato corretto. Il all'app vengono concesse solo le autorizzazioni che ha esplicitamente richiesto . Tuttavia, una volta che l'utente concede l'autorizzazione all'app, tutte le successive le richieste di autorizzazione in quel gruppo di autorizzazioni sono automaticamente scontato.


31
Pararth

GET_ACCOUNTS è stato spostato nel gruppo di autorizzazioni CONTACTS in Android 6.0 . Mentre l'API ci fornisce le autorizzazioni, all'utente (almeno per Android 6.0) vengono richiesti i gruppi di autorizzazioni. Quindi, all'utente verrà dato lo stesso prompt per GET_ACCOUNTS come l'utente otterrebbe per READ_CONTACTS o WRITE_CONTACTS.

18
CommonsWare

Fortunatamente questo cambierà in Android N 

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

L'autorizzazione GET_ACCOUNTS è ora deprecata. Il sistema ignora questo permesso per app che hanno come target Android N.

6
ibmkhd

In Marshmallow tutte le autorizzazioni pericolose appartengono ai gruppi di autorizzazioni. 

Il permesso Android.permission.GET_ACCOUNTS appartiene a CONTACTS group 

Puoi trovare ulteriori informazioni sui permessi pericolosi e sui loro gruppi qui:
https://developer.Android.com/guide/topics/security/permissions.html#normal-dangerous

2
Mattia Maestrini

Ho sbagliato la tua domanda prima. In questa pagina http://developer.Android.com/guide/topics/security/permissions.html#perm-groups , puoi vedere che GET_ACCOUNTS fa riferimento ai contatti del gruppo di autorizzazioni. Per questo motivo viene richiesto il permesso di contatto.

1
Thomas R.

Se utilizzi l'autorizzazione GET_ACCOUNTS per chiedere all'utente di selezionare un determinato tipo di account sul dispositivo (Google nel mio caso), puoi utilizzare la classe AccountPicker che non richiede autorizzazioni speciali

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.
}

Avrai bisogno dell'autorizzazione dei servizi di Google Play nelle dipendenze gradle

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

Questo evita il popup di autorizzazione Contatti per me

0
Jer