Developer Preview 2 apporta alcune modifiche al modo in cui le autorizzazioni sono richieste dall'app (vedi anche http://developer.android.com/preview/support.html#preview2-notes ).
La prima finestra di dialogo ora appare così:
Non è presente la casella di controllo "Non mostrare più" (a differenza dell'anteprima per gli sviluppatori 1). Se l'utente nega l'autorizzazione e se l'autorizzazione è essenziale per l'app, potrebbe presentare un'altra finestra di dialogo per spiegare il motivo per cui l'app richiede tale autorizzazione, ad esempio in questo modo:
Se l'utente rifiuta di nuovo l'app dovrebbe spegnersi se necessita assolutamente di tale autorizzazione o continuare a funzionare con funzionalità limitate. Se l'utente riconsidera (e seleziona riprova), l'autorizzazione viene nuovamente richiesta. Questa volta il prompt è simile al seguente:
La seconda volta viene visualizzata la casella di controllo "Non chiedere più". Se l'utente nega di nuovo e la casella di controllo è selezionata, non dovrebbe succedere altro. È possibile determinare se la casella di controllo è selezionata o meno utilizzando Activity.shouldShowRequestPermissionRationale (String), ad esempio in questo modo:
if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) {...
Ecco cosa dice la documentazione di Android ( https://developer.android.com/training/permissions/requesting.html ):
Per aiutare a trovare le situazioni in cui è necessario fornire ulteriori spiegazioni, il sistema fornisce il metodo Activity.shouldShowRequestPermissionRationale (String). Questo metodo restituisce true se l'app ha richiesto questa autorizzazione in precedenza e l'utente ha rifiutato la richiesta. Ciò indica che probabilmente dovresti spiegare all'utente perché hai bisogno dell'autorizzazione.
Se in passato l'utente ha rifiutato la richiesta di autorizzazione e ha scelto l'opzione Non chiedere più nella finestra di dialogo del sistema di richiesta di autorizzazione, questo metodo restituisce false. Il metodo restituisce inoltre false se la politica del dispositivo proibisce all'app di disporre di tale autorizzazione.
Per sapere se l'utente negato con "non chiedere mai più" è possibile verificare nuovamente il metodo shouldShowRequestPermissionRationale nel proprio onRequestPermissionsResult quando l'utente non ha concesso l'autorizzazione.
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_PERMISSION) {
// for each permission check if the user granted/denied them
// you may want to group the rationale in a single dialog,
// this is just an example
for (int i = 0, len = permissions.length; i < len; i++) {
String permission = permissions[i];
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
// user rejected the permission
boolean showRationale = shouldShowRequestPermissionRationale( permission );
if (! showRationale) {
// user also CHECKED "never ask again"
// you can either enable some fall back,
// disable features of your app
// or open another dialog explaining
// again the permission and directing to
// the app setting
} else if (Manifest.permission.WRITE_CONTACTS.equals(permission)) {
showRationale(permission, R.string.permission_denied_contacts);
// user did NOT check "never ask again"
// this is a good place to explain the user
// why you need the permission and ask if he wants
// to accept it (the rationale)
} else if ( /* possibly check more permissions...*/ ) {
}
}
}
}
}
Puoi aprire le impostazioni dell'app con questo codice:
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_PERMISSION_SETTING);
Non è possibile inviare l'utente direttamente alla pagina di autorizzazione.