Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 28 di 97
  • livello avanzato
Indice lezioni

Gestire i file

Come leggere e scrivere i file esterni e interni in Android: impariamo a conoscere tutti i principali metodi disponibili.
Come leggere e scrivere i file esterni e interni in Android: impariamo a conoscere tutti i principali metodi disponibili.
Link copiato negli appunti

Tutte le applicazioni Android hanno la possibilità di interagire con il filesystem delle memorie di massa installate nel dispositivo, spesso costituite da SD card.

In questo capitolo vedremo come possono essere gestite sia nel caso di supporti fissi, sia nel caso di supporti rimovibili. Il requisito fondamentale per il loro utilizzo è una buona conoscenza del sottosistema di I/O del linguaggio Java, specialmente del suo concetto fondante, gli stream.

Se il lettore ha già confidenza con questi strumenti non troverà grosse difficoltà nel seguire il discorso ed i principali aspetti di novità che potrà riscontrare saranno gli accorgimenti presi per l'adattamento di queste tecniche alla filosofia del sistema Android.

Distinzione basilare: Internal Storage vs. External Storage

La prima distinzione da imparare è quella tra lo spazio interno all'applicazione e quello esterno. Parte di questa distinzione verte su quel concetto di riservatezza dei dati propri di un'applicazione di cui si è discusso al principio di questa guida.

Ogni app ha a disposizione uno spazio disco, detto Storage interno (o Internal Storage) che risiede in una parte del filesystem e a cui solo l'applicazione dovrebbe accedere. Il percorso in Android che porta in questa posizione è /data/data/package_java_della_applicazione/files.

Il percorso è in formato Linux quindi lo '/' iniziale indica la root del filesystem. Notare che in /data/data lo spazio dell'applicazione prende il nome dal package Java. Se ad esempio la nostra app avesse package Java it.html.guida, i file salvati nello storage interno sarebbero collocati in: /data/data/it.html.guida/files.

Per External Storage, Android sceglie una posizione in cui collocare tutto un insieme di risorse che sono di utilità e consultazione generale nel dispositivo (musica, suonerie, film e così via). Solitamente dovrebbe essere collocato su una SD card esterna al sistema ma non è detto che sia un supporto rimovibile, potrebbe essere interno al dispositivo e fisso.

Ora si entrerà nei dettagli di entrambe le tipologie di storage.

Storage interno

Per accedere allo storage interno si usano per lo più due metodi, entrambi appartenenti al Context:

  • FileInputStream openFileInput(String filename): apre un file in lettura. Come parametro in input viene passato il nome del file. Non serve specificare il percorso in quanto sarà obbligatoriamente quello messo a disposizione dallo storage interno;
  • FileOutputStream openFileOutput(String filename, int mode): apre uno stream in scrittura anche questo nello storage interno. Per il nome del file, vale quanto detto per l'input. A proposito del secondo parametro, si può impostare alla costante Context.MODE_APPEND per concatenare i nuovi contenuti a quelli già esistenti nel file.

Notare che sono disponibili anche due costanti MODE_WORLD_READABLE e MODE_WORLD_WRITEABLE che servono a rendere il file accessibile anche al di fuori dello storage interno. Questi valori sono stati deprecati ormai da molto tempo, sin dalle API di livello 17, in quanto non in linea con il principio di riservatezza dei dati interni all'applicazione.

Una volta ottenuto uno Stream, in input o in output che sia, va gestito come normale classe Java per procedere alle operazioni, rispettivamente, di lettura o scrittura.

Storage esterno

Anche per lo Storage esterno, le operazioni su filesystem si svolgono mediante Stream e le consuete classi Java. L’accesso avverrà mediante metodi e costanti presenti nella classe Environment e nel Context.

La prima operazione da svolgere è controllare lo stato del supporto. Lo si fa con il metodo statico String Environment.getExternalStorageState().

La stringa restituita può avere una molteplicità di valori, tutti associati a costanti della classe Environment. Evitando di elencarli tutti, teniamo presente solo che due valori in particolare ci dicono che il supporto può essere usato:

  • Environment.MEDIA_MOUNTED: il caso migliore. Supporto disponibile in lettura/scrittura;
  • Environment.MEDIA_MOUNTED_READ_ONLY: il supporto è disponibile ma solo in lettura.

Tutti gli altri valori indicano situazioni problematiche da valutare a seconda delle circostanze.

Una volta controllato lo stato del supporto e del relativo filesystem, è arrivato il momento di lavorarci direttamente. L’accesso alle cartelle dello Storage esterno si ottiene con il metodo del Context getExternalFilesDirs che restituisce un array di oggetti File di cui il primo rappresenta lo storage esterno primario. Il metodo getExternalFilesDir, sempre del Context, permetterà l'accesso a specifiche cartelle il cui nome coinciderà con la stringa passatagli come argomento.

Dal riferimento all'oggetto File ottenuto, è possibile, secondo le procedure Java, leggere i contenuti, lavorare sui dati e via dicendo.

È sconsigliabile salvare file direttamente nella cartella principale dello storage esterno, normalmente esso contiene delle cartelle associate alle principali tipologie di contenuti:

  • Alarms, per i suoni da abbinare agli allarmi;
  • Download, per i file scaricati;
  • Movie, per i film;
  • Music, per i file musicali;
  • Notifications, per i suoni delle notifiche;
  • Pictures, per le foto;
  • Podcasts, per i file di podcast;
  • Ringtones, per le suonerie.

Ciò non impedisce ovviamente che ve ne possano essere altre.

Quella della gestione dei file è il primo caso di persistenza che incontriamo in questa guida. Eppure per il programmatore riveste una grande importanza, soprattutto perchè serve a gestire foto, musica, suonerie e tanti altri dati dalla forte connotazione personale destinati ad intrecciarsi indissolubilmente con la vita dell'utente-tipo.

Ti consigliamo anche