2012-09-07 10 views
12

Bene, questa non è esattamente una domanda, in quanto non sono realmente "bloccata" sul mio codice, ma ho trovato un comportamento strano per le API Android in merito all'accesso alla memoria esterna e al metodo File.createTempFile(), e Mi piacerebbe capire cosa sta succedendo ...Qual è il modo migliore per creare file temporanei su Android?

Si prega di notare che il mio manifest non include il <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">.


Parte 1:

Ho il seguente codice che fa lavoro come un fascino:

File tempFile = new File(Environment.getExternalStorageDirectory(), 
         "my_temp_file.png"); 

si crea un file temporaneo per me, e io in grado di scrivere dati in esso senza alcun problema.

Domanda 1: Perché funziona, dato che non dovrei avere diritti di scrittura sulla mia SDCard?


Parte 2:

Ho provato a cambiare il mio codice per utilizzare il createTempFile che è il metodo ufficiale per creare il file temporaneo. Così ho provato:

File tempFile = File.createTempFile("my_temp", "png", 
         Environment.getExternalStorageDirectory()); 

e ha aggiunto la WRITE_EXTERNAL_STORAGE nel mio manifest.xml. Indovina un po ? Questo non funziona, e ho un java.io.IOException:

09-07 14:07:29.061: E/_CLOG(19982): java.io.IOException: Permission denied 
09-07 14:07:29.061: E/_CLOG(19982):  at java.io.File.createNewFileImpl(Native Method) 
09-07 14:07:29.061: E/_CLOG(19982):  at java.io.File.createNewFile(File.java:1257) 
09-07 14:07:29.061: E/_CLOG(19982):  at java.io.File.createTempFile(File.java:1322) 
09-07 14:07:29.061: E/_CLOG(19982):  at com.(...).onClick(ProfileImageUpdater.java:58) 

Domanda 2: perché questo non funziona, mentre imho dovrebbe?

+1

Hai ricontrollato? –

+0

Sì assolutamente :) Entrambi i casi –

+0

Quale Android API stai usando? Credo che se si imposta l'API al livello 4, allora alcune autorizzazioni non vengono applicate – tomi

risposta

0

Finalmente ho capito cosa stava accadendo ...

Domanda 1: In effetti, il file creato doveva essere utilizzato dall'applicazione di sistema per recuperare e ritagliare un'immagine dalla galleria dell'utente. Quindi la mia app non doveva possedere l'autorizzazione WRITE_EXTERNAL_STORAGE, poiché il file era stato scritto dal sistema stesso.

Domanda 2: non ne sono sicuro. Immagino che Android non permetta di creare un file temporaneo in cui stavo cercando (dato che non è il posto giusto)

4

si riceve questo errore perché si dichiara sul permesso manifest.xml di scrivere nella memoria esterna. è necessario aggiungere questa autorizzazione.

inoltre, non scrivere mai e poi mai mai file (specialmente temporanei) direttamente su getExternalStorage().

Questo verrà inserito direttamente sulla scheda SD e creerà un disastro. Per i file temporanei che è solo per essere visto da una propria applicazione si dovrebbe usare:

getExternalStorage() + "/Android/data/<package_name>/cache/" 

sostituirli con la vostra applicazione confezionato, per esempio com. Orabig.myFirstApp quella cartella speciale viene automaticamente eliminata dal sistema se l'utente disinstalla l'applicazione, mantenendo il sistema libero da file temporanei.

edit:

Si prega di notare che il mio manifesto non include il

si deve!

edit: anche, se la creazione di file multimediali temporanei (PNG per esempio) è buona norma creare un file vuoto denominato .nomedia per quella cartella. In tal modo si evita di scannerizzare Media Scanner e mostrarlo nella galleria.

ultima modifica:

e prima di creare i file è necessario creare la cartella chiamando mkdirs() sull'oggetto file.

+0

Immagino tu intenda "nuovo file (Environment.getExternalStorageDirectory(),"/Android/data//cache/temp_crop_file.png ");'? –

+0

Stavo indicando solo la cartella. Quindi crei qualsiasi file che desideri lì. =] e non dimenticare che DEVI DICHIARARE sul manifest o avrai sempre un errore. – Budius

+0

Grazie per il suggerimento sulla directory (buon punto) e il .nomedia (ottimo punto). Tuttavia, non hai letto attentamente la mia domanda quando dici "devi". Il mio primo codice funziona, ma mi chiedo: "perché funziona", non "cosa devo fare per farlo funzionare". :) –

12

provare come questo ...

File outputDir = context.getCacheDir(); // context being the Activity pointer 
File outputFile = File.createTempFile("prefix", "extension", outputDir); 

Edit:

per Domanda 2

Può essere questione come di seguito link ...

Environment.getExternalStorageDirectory does not return the path to the removable storage

+0

Ho provato e hai ragione, funziona, ed è un posto migliore per i file temporanei rispetto alla directory esterna. Tuttavia, questo non risponde alle mie domande ... Per favore, rileggi. –

Problemi correlati