Originariamente inviato da lo Staff
Poiché leggo un po' ovunque di persone che hanno aggiornato a KitKat (per ora con ROM non ufficiali) e non riescono più ad accedere in scrittura alla propria scheda SD esterna apro questo thread per fare un po' di chiarezza. Lo apro in questa sezione perché riguarda trasversalmente tutti i modelli di S4 (Google Edition inclusa) e riguarderà anche quelli venduti da noi quando usciranno i firmware ufficiali per l'Italia e gli utenti inizieranno a fare l'aggiornamento ignari di come sono cambiate le cose.
Inizio spiegando come Android fin dalle sue origini considera gli spazi di memorizzazione.
Fin dalla prima versione (1.0) esistono sostanzialmente due memorie: Interna ed esterna.
La prima è esclusivamente interna al dispositivo ed è, solitamente, limitata a qualche centinaio di MB. Tecnicamente parlando è la partizione dati (/data) ed è quella in cui solitamente vengono installate le applicazioni, in particolar modo quelle che hanno parti di codice che dev'essere sempre disponibile fin dall'avvio (services, widgets, live wallpaper ecc...). In essa le applicazioni possono anche salvare dei file tenendo però conto che lo spazio a disposizione è abbastanza limitato.
La seconda nei primi dispositivi Android era costituita dall'eventuale scheda SD esterna e per questo motivo mediante un link simbolico è stata comunemente resa accessibile alle applicazioni sotto il path "/sdcard". Con l'evoluzione degli smarthpone i produttori hanno iniziato ad integrarla nei dispositivi (i famosi 16Gb/32Gb/64Gb) non più rimovibile ma agli occhi di Android e delle applicazioni essa è come se fosse ancora una memoria "esterna". Sotto di essa le applicazioni sono solite memorizzare i dati "pesanti" quali mappe dei navigatori, foto, video, registrazioni sonore, documenti e quant'altro. Esiste una speciale directory al suo interno che si chiama "Android" sotto la quale ciascuna applicazione dispone di uno spazio "personale" per memorizzare i propri file privati (file), dati emporanei (cache) o dati di altro tipo solitamente di grosse dimensioni (obb) e che si presume non siano accessibili alle altre applicazioni.
Fin dalle API 1.0 l'accesso in scrittura alla memoria interna da parte delle applicazioni è sempre stato limitato al solo spazio dedicato all'applicazione stessa (/data/data/nome.della.applicazione/) mentre in lettura salvo avere i permessi di root è limitato ad una manciata di file e directory pubblicamente accessibili in lettura e null'altro.
L'accesso in scrittura alla (eventule) memoria esterna era anch'esso limitato alla sola directory destinata all'app (/sdcard/Android/data/nome.della.applicazione/) ma le applicazioni possono richiedere due particolari permessi: WRITE_EXTERNAL_STORAGE e READ_EXTERNAL_STORAGE per poter scrivere e leggere (o solo leggere) qualsiasi file in essa presente.
Alcuni produttori hanno poi iniziato a fornire l'accesso ad altre memorie "esterne" quali schede SD o dispositivi USB connessi tramite cavetto OTG. L'accesso a tali memorie non è mai stato molto chiaro da parte di Google che, per ragioni difficilmente comprensibili ma si suppone legate ai suoi servizi di cloud, non ha mai amato le schede SD e i dispositivi di memorizzazione esterni agli smartphone. Le specifiche di Android in tal senso hanno sempre fatto riferimento ad un particolare permesso: WRITE_MEDIA_STORAGE senza il quale nessuna applicazione dovrebbe poter accedere in scrittura a suddetti dispositivi. Peccato che tale permesso possa venire concesso solo alle applicazioni di sistema (per intenderci quelle di base più quelle fornite dai singoli produttori). Per consentire anche alle altre applicazioni (Dropbox, Tom Tom, file manager, programmi vari) di accedervi in scrittura i singoli produttori fa cui Samsung hanno arbitrariamente deciso di concedere tale permesso alle applicazioni che richiedono il permesso di WRITE_EXTERNAL_STORAGE e che, ricordo, stando a Google dovrebbe essere limitato alla sola memoria esterna "integrata" e non a quelle rimovibili.
Questo fino all'arrivo di KitKat...
Con KitKat sempre per ragioni poco logiche e comprensibili Google ha praticamente ordinato a tutti i produttori di dispositivi Android di attenersi rigorosamente ad una regola: il permesso di WRITE_EXTERNAL_STORAGE deve concedere l'accesso in scrittura solo alla prima memoria esterna (quella integrata per intenderci) e non a quelle esterne. E con quelle esterne, direte voi ?
Fin dalle prime API esistono due metodi a disposizione degli sviluppatori per sapere quali sono gli spazi "riservati" dal sistema alle proprie applicazioni (quindi non pubblici). Questi sono principalmente "getFilesDir" per la memoria interna e "getExternalFilesDir" per la prima memoria esterna (/sdcard). Sotto tali percorsi le applicazioni possono sempre scrivere e leggere i propri dati senza richiedere permessi particolari. Le altre applicazioni non possono accedervi e quando un'app viene rimossa anche i propri dati vengono rimossi. Con KitKat sono state introdotte nuove API fra cui "getExternalFilesDirs" (notare il plurale) che funziona esattamente come "getExternalFilesDir" ma anziché un solo percorso fornisce più percorsi uno per ciascuna memoria "esterna". Le regole rimangono invariate, solo sotto tali percorsi privati le applicazioni potranno scrivere e leggere i propri file. Questo include, quindi, anche le memorie SD esterne. Tutti gli altri file presenti in tali memorie SD esterne potranno ancora essere letti ma non si potrà ne cancellarli ne modificarli o crearne di nuovi.
Per semplicità riassumerò quindi i vari casi:
Dispositivi con firmware < 4.4 (precedenti a KitKat)
- Le applicazioni di sistema o fornite dal produttore (es. App Archivio) possono accedere in lettura e scrittura a tutte le memorie sia interne che esterne ad esclusione dei file di sistema, quelli privati delle singole app o protetti.
- Le applicazioni non di sistema (non importa se pre-installate come Dropbox o installate dallo Store) possono:
- Accedere in lettura e scrittura alla memoria interna solo nel proprio spazio personale, come restituito dal metodo "getFilesDir"
- Accedere in lettura e scrittura alla memoria esterna principale (integrata) solo nel proprio spazio personale, come restituito dal metodo "getExternalFilesDir", oppure accedere in lettura e scrittura a qualsiasi file tranne quelli privati/protetti se richiedono i permessi "READ_EXTERNAL_STORAGE" o "WRITE_EXTERNAL_STORAGE"
- Accedere in lettura e scrittura alla scheda SD esterna a qualsiasi file tranne quelli privati/protetti se richiedono i permessi "READ_EXTERNAL_STORAGE" o "WRITE_EXTERNAL_STORAGE" (come arbitrariamente deciso dai singoli produttori fra cui Samsung)
Dispositivi con firmware >= 4.4 (da KitKat in poi salvo ulteriori cambiamenti)
- Le applicazioni di sistema o fornite dal produttore (es. App Archivio) possono accedere in lettura e scrittura a tutte le memorie sia interne che esterne ad esclusione dei file di sistema, quelli privati delle singole app o protetti.
- Le applicazioni non di sistema (non importa se pre-installate come Dropbox o installate dallo Store) possono:
- Accedere in lettura e scrittura alla memoria interna solo nel proprio spazio personale, come restituito dal metodo "getFilesDir"
- Accedere in lettura e scrittura alla memoria esterna principale (integrata) solo nel proprio spazio personale, come restituito dal metodo "getExternalFilesDir", oppure accedere in lettura e scrittura a qualsiasi file tranne quelli privati/protetti se richiedono i permessi "READ_EXTERNAL_STORAGE" o "WRITE_EXTERNAL_STORAGE"
- Accedere in lettura e scrittura alla scheda SD esterna solo nel proprio spazio personale, come restituito dal nuovo metodo "getExternalFilesDirs" mentre l'accesso a qualsiasi altro file pubblico o privato che sia è consentito solo in lettura. Non esistono, ad oggi, permessi che possono essere richiesti da tali applicazioni per aggirare questa pesante limitazione!!!
La conseguenza più ovvia è che programmi come Sygic che fino ad oggi hanno fatto uso di una propria directory chiamata Sygic sotto la root della memoria che si intende usare potranno funzionare solo se questa si troverà nella memoria interna mentre su quella SD esterna avranno solo accesso in lettura. Per continuare a funzionare dovranno memorizzare i propri dati (es. mappe) esclusivamente nel proprio spazio privato (/storage/extSdCard/Android/data/nome.della.applicazione/) e da nessun'altra parte. Così come un programma di fotoritocco che aprirà una foto che avete salvato sulla SD esterna non potrà modificarla e salvarla nella stessa posizione ma dovrà chiedervi una nuova posizione nella memoria interna.
Spero ora di aver chiarito meglio la (poco piacevole) situazione e se aggiornerete a KitKat anche con firmware ufficiali saprete a cosa andate incontro. Inutile protestare con Samsung... le decisioni le ha prese Google ed i produttori possono scegliere o di continuare a fare di testa loro consentendo accesso non ristretto alle SD esterne (magari altre marche faranno così) oppure rispettare le richieste di Google. Ovviamente chi se ne frega della garanzia può sempre andare di rooting ed in rete già esistono soluzioni per "ripristinare" il comportamento precedente a KitKat.
AL SECONCO POST TROVATE UNA SERIE DI DOMANDE/RISPOSTE AI DUBBI PIU' COMUNI SU QUESTO ARGOMENTO, LEGGETELE CON ATTENZIONE PRIMA DI FARE DOMANDE