{"id":11672,"date":"2016-04-27T16:45:15","date_gmt":"2016-04-27T14:45:15","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=11672"},"modified":"2016-06-07T14:51:55","modified_gmt":"2016-06-07T12:51:55","slug":"permissions-cosa-cambia-con-android-6-marshmallow","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/permissions-cosa-cambia-con-android-6-marshmallow\/","title":{"rendered":"Permissions: cosa cambia con Android 6 Marshmallow"},"content":{"rendered":"<p>Chi <strong>programma per Android<\/strong> impara a gestire le permission sin dai primi esempi di codice. Non appena ci si trova infatti a dover accedere alla Rete o a scrivere su una scheda SD esterna, se non si conosce questo concetto, vengono rilevate\u00a0eccezioni di sicurezza che \u00e8 difficile afferrare\u00a0completamente.<br \/>\nL&#8217;idea di base \u00e8 questa: un&#8217;app Android lavora in un ambiente protetto, una <em>sandbox<\/em> come si dice spesso\u00a0nel gergo informatico e quando deve svolgere attivit\u00e0 al di fuori di esso deve segnalarlo al sistema.<br \/>\nPer farlo vengono\u00a0inserite nel file AndroidManifest.xml\u00a0dei campi <em>&lt;uses-permission&gt;<\/em> che dichiarano il tipo di attivit\u00e0 particolari che l&#8217;app deve svolgere.<\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;manifest xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n    package=\"it.devapp.permission\" &gt;\r\n    &lt;uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" \/&gt;\r\n    ...\r\n&lt;\/manifest&gt;\r\n<\/pre>\n<p>Una volta che l&#8217;utente installer\u00e0 l&#8217;app gli verr\u00e0 notificato l&#8217;elenco delle permission che essa contiene e\u00a0queste dovranno essere accettate\u00a0in blocco per proseguire.<br \/>\nTutto ci\u00f2 \u00e8 valido fino ad Android 5.1 incluso, ma con Marshmallow si cambia.<\/p>\n<h2>Permission normali e pericolose<\/h2>\n<p>Prima di entrare nel vivo del discorso facciamo una precisazione. Android suddivide le permission in due categorie:<\/p>\n<ul>\n<li><strong>Normali<\/strong>: intese come le permission che non mettono a rischio la privacy dell&#8217;utente. Includono la gettonatissima permission INTERNET ma anche tutte quelle che riguardano lo stato della rete, l&#8217;accesso a WI-FI e Bluetooth;<\/li>\n<li><strong>Pericolose<\/strong>: queste invece potrebbero essere pi\u00f9 lesive della riservatezza\u00a0dell&#8217;utente e riguardano aspetti come la comunicazione telefonica nel complesso (Contatti, telefonia, SMS), localizzazione, hardware come camera e registrazione audio, sensori e storage esterno.<\/li>\n<\/ul>\n<p>La distinzione \u00e8 utile perch\u00e8 a partire da Android 6 &#8211; le API 23 come diciamo noi sviluppatori &#8211; per le permission pericolose \u00e8 necessario che l&#8217;utente esprima esplicito assenso. Tale autorizzazione, inoltre, potr\u00e0 essere revocata in qualsiasi momento accedendo al pannello <em>Impostazioni<\/em> del dispositivo.<\/p>\n<p>Quest&#8217;ultimo aspetto comporter\u00e0 la necessit\u00e0 di prevedere il blocco delle funzionalit\u00e0 che necessitino di queste permission, senza causare l&#8217;arresto dell&#8217;applicativo. In pratica, un&#8217;app ben progettata dovr\u00e0 prevedere un funzionamento completo ed uno o pi\u00f9 funzionamenti parziali in mancanza della concessione di tutte le autorizzazioni.<\/p>\n<h2>Controllare una permission<\/h2>\n<p>Per poter lavorare con le nuove permission dovremo innanzitutto saper controllare se una permission \u00e8 stata accordata all&#8217;app. La classe <em>ContextCompat <\/em>&#8211; resa disponibile nella libreria di supporto &#8211;<em>\u00a0<\/em>prevede il metodo <em>checkSelfPermission<\/em> che accetta in input un riferimento al Context ed uno che indica la permission da verificare. Restituir\u00e0 un intero che incontrer\u00e0, a seconda che il permesso sia stato accordato o meno, \u00a0il valore PERMISSION_GRANTED o PERMISSION_DENIED definiti nella classe <em>PackageManager<\/em>.<\/p>\n<h2>L&#8217;uso nel\u00a0codice<\/h2>\n<p>Premessi i concetti fondamentali, possiamo vedere alcune righe di codice in cui cercheremo di gestire le permission nella maniera pi\u00f9 attuale possibile.\u00a0Immaginiamo che un&#8217;app per funzionare abbia bisogno di utilizzare la permission di localizzione.<\/p>\n<p>Questa andr\u00e0 per prima cosa dichiarata nel file AndroidManifest.xml come visto in precedenza e poi se ne dovr\u00e0 controllare l&#8217;attivazione a runtime trattandosi di una permission dangerous.<\/p>\n<p>Per fare ci\u00f2 apporremo il seguente codice in un metodo eseguito all&#8217;attivazione dell&#8217;Activity, diciamo in <em>onResume<\/em>:<\/p>\n<pre class=\"lang:java decode:true\">if (ContextCompat.checkSelfPermission(this,\r\n                Manifest.permission.ACCESS_FINE_LOCATION)\r\n        != PackageManager.PERMISSION_GRANTED) {\r\n\r\n    if (ActivityCompat.shouldShowRequestPermissionRationale(this,\r\n            Manifest.permission.ACCESS_FINE_LOCATION)) {\r\n\r\n        \/*\r\n          mostriamo una finestra di dialogo che spiega perch\u00e8 l'app \r\n          ha bisogno della permission e successivamente ne chiediamo \r\n          l'accettazione\r\n         *\/\r\n    } else {\r\n\r\n        \/\/ viene proposto all'utente di accettare la permission\r\n        ActivityCompat.requestPermissions(this,\r\n                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},\r\n                REQUEST_ID);\r\n    }\r\n}\r\n<\/pre>\n<p>Tale codice verr\u00e0 eseguito solo se ci troviamo in Android 6: in tutte le altre versioni la permission verr\u00e0 considerata concessa.<\/p>\n<p>Con il metodo <em>requestPermissions<\/em> verr\u00e0 aperta la finestra di dialogo con cui l&#8217;utente accetta o meno le permission. La risposta sar\u00e0\u00a0inoltrata al metodo <em>onRequestPermissionsResult<\/em> all&#8217;interno del quale riconosceremo la richiesta grazie al parametro REQUEST_ID usato:<\/p>\n<pre class=\"lang:java decode:true\">@Override\r\npublic void onRequestPermissionsResult(int requestCode,\r\n        String permissions[], int[] grantResults) {\r\n    switch (requestCode) {\r\n        case REQUEST_ID: {\r\n            if (grantResults.length &gt; 0\r\n                &amp;&amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {\r\n           \/\/ permission accettata: possiamo attivare il codice\r\n\r\n            } else {\r\n\r\n               \/\/ permission negata: disattiviamo i servizi che ne hanno bisogno\r\n            }\r\n        }\r\n\r\n    }\r\n}<\/pre>\n<p>Il codice da usare non \u00e8 complesso ma \u00e8 necessario comprendere bene quali sono le permission sottoposte a tale disciplina e dove collocare l&#8217;invocazione dei servizi in una tale struttura di blocchi if.<\/p>\n<p>Comunque sia, affronteremo tale nuova norma volentieri visto che rappresenta un passo importante nella difesa della privacy dell&#8217;utente.<\/p>\n<p>Alla prossima!<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Chi programma per Android impara a gestire le permission sin dai primi esempi di codice. Non appena&#8230;<\/p>\n","protected":false},"author":561,"featured_media":11964,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[8],"tags":[1672,1562,1673,969],"class_list":["post-11672","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guide-varie","tag-android-6-marshmallow","tag-creare-app-android","tag-permissions-android","tag-programmatori-android"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11672","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/561"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=11672"}],"version-history":[{"count":7,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11672\/revisions"}],"predecessor-version":[{"id":12082,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11672\/revisions\/12082"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/11964"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=11672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=11672"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=11672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}