Gestire i file

9 luglio 2014

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 che 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 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 la classe Environment.

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 alla cartella root dello Storage esterno primario si ottiene con il metodo statico: File getExternalStorageDirectory().

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.

Tutte le lezioni

1 ... 27 28 29 ... 82

Se vuoi aggiornamenti su Gestire i file inserisci la tua e-mail nel box qui sotto:
Tags:
 
X
Se vuoi aggiornamenti su Gestire i file

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy