fun checkPermissions() {\n \/\/ Controlliamo se i permessi sono stati concessi...\n if (ContextCompat.checkSelfPermission(thisActivity,\n Manifest.permission.ACCESS_FINE_LOCATION)\n != PackageManager.PERMISSION_GRANTED) {\n\n \/\/ Permessi non concessi\n \/\/ Dobbiamo mostrare una spiegazione?\n if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,\n Manifest.permission.ACCESS_FINE_LOCATION)) {\n \/\/ Mostra una spiegazione del perch\u00e8 la mancanza di questi permessi\n \/\/ pu\u00f2 negare alcune funzionalit\u00e0. Questa spiegazione pu\u00f2 essere\n \/\/ data con un semplice AlertDialog(). Alla riposta positiva (l'utente\n \/\/ accetta di dare i permessi) andremo a richiedere i permessi con\n \/\/ le istruzioni predefiniti (es. ActivityCompat.requestPermissions([...])\n \/\/ come mostrato qui sotto\n } else {\n \/\/ Nessuna spiegazione da dare, richiediamo direttamente i permessi\n ActivityCompat.requestPermissions(thisActivity,\n arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),\n REQUEST_LOCATION_PERMISSIONS)\n\n \/\/REQUEST_LOCATION_PERMISSIONS \u00e8 una costante che andremo ad utilizzare\n \/\/ nel metodo onRequestPermissionsResults([...]) per analizzare i risultati\n \/\/ ed agire di conseguenza\n }\n } else {\n \/\/ Fantastico, abbiamo gi\u00e0 i permessi, possiamo fare tutti i danni che vogliamo :D\n }\n}\n\n<\/pre>\nIl flusso che vi ho descritto qua sopra pu\u00f2 essere considerato abbastanza “standard”, ovvero pu\u00f2 adattarsi a qualsiasi tipo di permesso<\/strong>. Il concetto, per concludere, \u00e8 piuttosto semplice, quindi: Ho i permessi? Si: faccio le mie cose. No? Guardo se devo richiederli di nuovo, altrimenti mi rassegno ?<\/p>\nUltimo e non ultimo, il metodo<\/strong> …<\/p>\noverride fun onRequestPermissionsResults([...])<\/pre>\n… in cui andremo ad esaminare se i permessi sono stati concessi ed eventualmente attivare \/ disattivare \/ far partire alcune funzionalit\u00e0<\/strong><\/p>\noverride fun onRequestPermissionsResult(\n requestCode: Int,\n permissions: Array<out String>,\n grantResults: IntArray\n) {\n super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n when (requestCode) {\n REQUEST_LOCATION_PERMISSIONS -> {\n map?.uiSettings.isMyLocationButtonEnabled = false\n if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {\n button_position_on_me.visibility = View.VISIBLE\n map.isMyLocationEnabled = true\n } else {\n button_position_on_me.visibility = View.GONE\n map.isMyLocationEnabled = false\n Snackbar.make(\n view!!,\n getString(R.string.gps_permissions_not_granted),\n Snackbar.LENGTH_INDEFINITE\n )\n .setAction(android.R.string.ok) {\n checkLocationPermissions()\n }\n .show()\n }\n }\n }\n}<\/pre>\nIn questo esempio, preso da un’applicazione reale che *MODALITA’ EGO ENORME ON<\/strong>* ha sulle spalle centinaia di migliaia di installazioni attive *MODALITA’ EGO ENORME OFF<\/strong> ? * possiamo osservare che esaminando il responso della richiesta permessi vengono attivati \/ disattivati pulsanti e posizioni utente sulla mappa.<\/div>\nQuesto fa capire che certe funzionalita, soggette a restrizioni di permessi, sarebbe opportuno che partissero SOLO in questo metodo (onRequestPermissionsResult() ). Per il semplice motivo che se vado a richiedere permessi che sono gi\u00e0 stati concessi, in questo metodo il sistema operativo mi passer\u00e0 comunque la risposta, ed in base a questa potr\u00f2 muovermi.<\/div>\n<\/div>\n\n\nQuindi, ricapitolando, ecco alcuni punti che potrebbero chiarirvi dei dubbi:<\/strong><\/p>\n\n\n\n- Leggetevi la Documentazione ufficiale<\/a><\/strong>. Questa, per quanto prolissa (e forse anche un tantino confusa), pu\u00f2 nella maggior parte dei casi risolvere il problema che vi sta assillando. Soprattutto date un’occhiata ai Livellli di protezione<\/a><\/strong>, in modo da capire se e quando richiedere o meno il coinvolgimento dell’utente della vostra fantastica App, in modo che il funzionamento sia garantito.<\/li>
- Una volta capito come dovrebbero funzionare, cercate di assimilare un concetto di base. Di per s\u00e9 la richiesta di un’autorizzazione \u00e8 un’operazione parecchio invasiva, soprattutto perch\u00e9, ad oggi, moltissimi utenti sono diffidenti nel dare autorizzazioni alle App<\/strong> perch\u00e9 si sentono “controllati”. Quindi si deve cercare di pensare al flusso dell’App in modo che guidi il pi\u00f9 possibile a questa operazione avendo gi\u00e0 coinvolto l’utente.<\/strong>\nVi faccio un esempio<\/strong>: se la vostra App prevede l’utilizzo del salvataggio di documenti nella memoria del telefono, \u00e8 necessario che l’utente sia coinvolto nel flusso della richiesta dei permessi *SE E SOLO SE* sta tentando di effettuare questa operazione di salvataggio. Ovvero, a meno che la funzionalit\u00e0 principale dell’App non sia proprio il salvataggio di documenti, sarebbe opportuno chiedere i permessi all’utente solo quando questo sta salvando un documento ed i permessi non sono stati accordati.\nPerch\u00e9 dico questo?<\/strong> Poniamo il caso che un’App che sto progettando abbia bisogno di 3 tipi di permessi espliciti: Fotocamera, Salvataggio files e Localizzazione GPS. Ora, se sono pigro (sbagliando), chiedo tutti i permessi subito, all’apertura dell’App, in modo da “togliermi subito il sassolino dalla scarpa”. Ovviamente non c’\u00e8 niente di pi\u00f9 sbagliato, oppure giusto per togliersi di mezzo subito una bella fetta di utilizzatori potenziali dell’App. Ci sono utenti a cui non da fastidio rispondere alla domanda “Vuoi concedere i permessi di localizzazione?<\/em>” nonostante non ci sia neanche una mappa caricata nell’Activity attuale, ci sono invece utenti che non appena vedono le finestre di richiesta permessi si insospettiscono e chiudono \/ disinstallano l’App al volo.<\/li>
- Prima di chiedere un’autorizzazione e mostrare il dialog di sistema per richiedere i permessi date sempre una spiegazione del perch\u00e9 e come andrete ad utilizzare quelle funzionalit\u00e0<\/strong>. Ad esempio, se la vostra App ha una mappa in cui si vuole visualizzare il classico puntino blu della posizione dell’utente, \u00e8 necessario richiedere i permessi di localizzazione. Per questo, la prima volta che si apre l’App, sarebbe bene spiegare, in un OnBoarding oppure in un dialog quando la mappa \u00e8 caricata, il perch\u00e9 andremo a chiedere i permessi. Un AlertDialog che dice “Se vuoi vedere la tua posizione mostrata sulla mappa \u00e8 necessario che tu accetti la richiesta di concedere l’accesso ai permessi di localizzazione all’APP. Vuoi continuare?<\/em>“. SOLO a questo punto e se l’utente accetta, mostreremo il dialog di sistema.<\/li><\/ol>\n\n\n\n