2012-12-13 20 views
13

From here Conosco un modo per scrivere un file ed essere accessibile ad altre app e altre intenzioni, ma ora che il Context.MODE_WORLD_READABLE è deprecato come posso farlo in sicurezza?Android: alternativa al deprecato Context.MODE_WORLD_READABLE?

FileOutputStream out = myActivity.openFileOutput(fileTo, Context.MODE_WORLD_READABLE); 

Ok maggiori informazioni:

sto usando questo:

intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(uri, "video/*"); 

E l'uri sarà quello che scriverò in una posizione sdcard. E il video verrà dall'applicazione, quindi il problema è, se questo non è consentito, come posso scrivere il file e vederlo.

risposta

11

E gli uri sarà quello che scriverò in una posizione sdcard.

Questo è già MODE_WORLD_WRITABLE per impostazione predefinita. Si noti inoltre che il codice che si è elencato (openFileOutput()) fa non scrive su memoria esterna (ciò che si chiama in modo errato "sdcard"). openFileOutput() è per la memoria interna.

E il video verrà dall'applicazione, quindi il problema è, se questo non è consentito, come posso scrivere il file e vederlo.

Se siete veramente scrivendo il file di archiviazione esterna, basta usare un puntamento Uri a tale file.

Se si sta scrivendo il file nell'archivio interno, creare un numero ContentProvider per servire quel file e utilizzare unche punta a quello ContentProvider. Here is a sample application con un ContentProvider che estrae un file PDF da assets/ alla prima esecuzione, quindi serve quel file tramite openFile() in modo che possa essere visualizzato da un visualizzatore PDF.

+0

Grazie. Quello colpisce il punto. : D – Marl

+1

Se un file video è stato salvato come file nella memoria interna (usando la posizione data da 'getCacheDir'), stai dicendo che ContentProvider potrebbe in qualche modo servire un URI a una VideoView che sia poi riproducibile? Perché l'URI diretto al video salvato internamente non funziona (suppongo perché un file video deve essere leggibile in tutto il mondo per essere riprodotto da una visualizzazione video, ma non è leggibile da un mondo se nella cache interna privata dell'applicazione). –

+0

@DanielSmith: "stai dicendo che ContentProvider potrebbe in qualche modo servire un URI a una VideoView che è poi riproducibile?" - il video è complicato, perché di solito il giocatore ha bisogno di un flusso cercabile (può spostarsi avanti e indietro) e un flusso pubblicato da un ContentProvider non è ricercabile. Non sono a conoscenza di formati video che possono essere riprodotti con un flusso forward-only, sebbene non abbia effettuato ricerche in merito. – CommonsWare

3

Sembra che i documenti siano chiari.

Questa costante è stata sconsigliata a livello di API 17.

Creazione di file leggibile in tutto il mondo è molto pericoloso, e può causare buchi di sicurezza nelle applicazioni. È fortemente scoraggiato; invece, le applicazioni devono utilizzare un meccanismo più formale per interazioni come ContentProvider, BroadcastReceiver e Service. Non ci sono garanzie che questa modalità di accesso rimarrà su un file, come ad esempio quando passa attraverso un backup e ripristino. Modalità di creazione file: consente a tutte le altre applicazioni di avere accesso in lettura al file creato.

+0

aggiunto ulteriori dettagli alla mia domanda .. – Marl

7

salvare il video nella memoria interna utilizzando:

openFileOutput("test.mp4", "MODE_PRIVATE"); 

poi fare questo:

String path = context.getFilesDir().getAbsolutePath() + "/test.mp4"; // path to the root of internal memory. 
File f = new File(path); 
f.setReadable(true, false); 
Intent playIntent .... 
playIntent.setType("video/*"); 
playIntent.setData(Uri.fromFile(f)); 

Good Luck.

+0

Grazie per avermi aiutato, non volevo usare sdcard per un file temporaneo, nota che questo è Api 9 o superiore, quindi ho finito usando mode_world_readable per Api 8, e questo per 9 e versioni successive. –

+0

ovviamente la scelta migliore è ContentProvider, in alcuni casi questo non funzionerà. ad esempio, i giocatori non possono accedere ai file srt salvati nella stessa posizione del file video e hanno usato lo stesso nome anche se abbiamo impostato READ per i file srt. – hasan83

+0

@ hasan83 se scrivo un file utilizzando FileOutputStream in data/data/com. ****. ***/myfolder, non mi permette di leggere il file come sopra qualsiasi motivo? – NitZRobotKoder