2011-04-23 14 views
13

Ho un'applicazione che salva i file scaricati da un server. Questi file non sono privati ​​della mia applicazione e dovrebbero essere accessibili anche ad altre applicazioni. Voglio sapere quale sarebbe il percorso corretto per salvare questi file quando la scheda SD è ASSENTE. Per la scheda SD, c'è l'API noto -Salvataggio di file pubblici nella memoria interna

getExternalStorageDirectory() 

per dati privati ​​dell'applicazione nella memoria interna è -

Context.getFilesDir() 

In alcuni dispositivi, la memoria interna è rappresentata da/EMMC /.

Sarà davvero utile se qualcuno potrebbe elaborare su/emmc /. So che sta per scheda di memoria incorporata e non è presente in tutti i dispositivi. Ma è davvero rappresentativo della memoria interna? O è il terzo ricordo?

Devo salvare i file utilizzando openFileOutput() con MODE_WORLD_READABLE?

risposta

9

Su alcuni dispositivi, la memoria interna è rappresentata da/emmc /.

/emmc/ può esistere su alcuni dispositivi, e può essere interna, ma potrebbe non essere accessibile alle applicazioni, e certamente non fa parte del SDK Android a meno che ciò accade di essere ciò che getExternalStorageDirectory() ritorni.

Ma è davvero rappresentativo della memoria interna?

No.

o è il terzo di memoria?

Chiedi al produttore del tuo dispositivo.

Devo salvare i file utilizzando openFileOutput() con MODE_WORLD_READABLE?

Impossibile rispondere in modo astratto. Dici che i tuoi file "dovrebbero essere accessibili anche ad altre applicazioni", ma non hai indicato perché ti aspetti che altre applicazioni si preoccupino un po 'dei tuoi file. Altre applicazioni non eseguiranno la scansione delle tue directory per i file - nella migliore delle ipotesi, permetteranno agli utenti di esplorare la memoria esterna. L'unico motivo per cui un file è MODE_WORLD_READABLE è se l'applicazione attiverà un'altra applicazione per fare qualcosa con il file (ad es. ACTION_VIEWIntent).

+0

grazie CommonsWare! Sì, la mia applicazione che attiva altre applicazioni con ACTION_VIEW è esattamente la ragione per cui pubblico questi file. Inoltre, poiché alcuni esploratori di file e applicazioni eseguono la scansione della scheda SD e della memoria interna, voglio che siano in grado di trovare questi file. Quindi, la mia domanda rimane, dove salvare il file nel caso in cui la scheda SD non viene trovata? – Akshay

+0

@Akshay: "Inoltre, poiché alcuni esploratori di file e applicazioni eseguono la scansione della scheda SD e della memoria interna, voglio che siano in grado di trovare questi file." - Non è possibile, o se lo è, è un grosso buco di sicurezza. "Quindi, la mia domanda rimane, dove salvare il file nel caso in cui la scheda SD non viene trovata?" - 'getFilesDir()'. – CommonsWare

+0

Grazie a CommonsWare! Sto cercando di capirlo chiaramente. La mia applicazione può essere paragonata a un client di posta elettronica che scarica gli allegati e consente ai visualizzatori di documenti e ai lettori multimediali di aprire questi file. Dove sarebbe un client di posta elettronica salvare i file se la scheda SD è assente? Non c'è una directory pubblica nella memoria interna? Qualcosa come/internal_memory/downloads? Perché dovresti considerare la scansione della memoria interna come un buco di sicurezza? Giusto per confermare, la memoria interna implica memoria del dispositivo/telefono, giusto? Ci scusiamo per la raffica di domande. – Akshay

14

Mi rendo conto che questo è vecchio e ha una risposta accettata, ma penso che la domanda sia ancora pertinente e che ci sia un modo per ottenere ciò che vuole il richiedente.

Per parafrasare, credo che il richiedente voglia salvare un file e renderlo accessibile (ad esempio per la visualizzazione) da altre app, senza dover pensare all'archiviazione esterna (ad esempio un'ulteriore autorizzazione e la possibilità che lo spazio di archiviazione esterno sia non presente).

Si scopre che è possibile rendere i propri file leggibili da altre app.

File file = new File(ctx.getCacheDir(), "picture");    
... 
file.setReadable(true, false); 
    // makes file readable to other apps 

// Get another app to view my picture 
Uri uri = Uri.fromFile(file);   
Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(uri, "image/*"); 
ctx.startActivity(intent); 

Il setReadable ha reso il lavoro codice di cui sopra per me -, senza che la linea l'applicazione spettatore non in grado di leggere il file. Notare che setReadable opera sull'intera directory, quindi la soluzione migliore è probabilmente quella di creare un nome di sottodirectory 'public' e inserire i file lì.

+3

Your a lifesaver! La risposta accettata si concentra troppo sul perché non si dovrebbe fare questo e non il reale come. –

Problemi correlati