2012-09-07 13 views
12

Bueno, esto no es exactamente una pregunta, ya que no estoy realmente "atrapado" en mi código, pero he encontrado un comportamiento extraño para la API de Android con respecto al acceso al almacenamiento externo y el método File.createTempFile(), y Me gustaría entender qué está sucediendo ...¿Cuál es la mejor manera de crear archivos temporales en Android?

Tenga en cuenta que mi manifiesto no incluye el <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">.


Parte 1:

tengo el siguiente código, que hace trabajo como un encanto:

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

crea un archivo temporal para mí, y puedo escribir Datas en él sin ningún problema.

Pregunta 1: ¿Por qué funciona, ya que no se supone que tenga derechos de escritura en mi tarjeta SD?


Parte 2:

He tratado de cambiar el código para utilizar el createTempFile que es el método oficial para crear el archivo temporal. Así que he intentado:

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

, y añadió la WRITE_EXTERNAL_STORAGE en mi manifest.xml. Adivina qué ? Esto no funciona, y me da 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) 

Pregunta 2: ¿Por qué esto no funciona, mientras que en mi humilde opinión lo que debería?

+1

¿Lo has verificado dos veces? –

+0

Sí absolutamente) Ambos casos –

+0

¿Qué api de Android estás usando? Creo que si uno establece la API en el nivel 4, entonces no se aplican ciertos permisos – tomi

Respuesta

0

Finalmente descubrí lo que estaba pasando ...

Pregunta 1: De hecho, el archivo que se creó estaba destinado a ser utilizado por la aplicación del sistema para recuperar y recortar una imagen de la galería del usuario. Por lo tanto, mi aplicación no debe tener el permiso WRITE_EXTERNAL_STORAGE, ya que el archivo fue escrito por el propio sistema.

Pregunta 2: No estoy seguro. Supongo que el Android no permite crear un archivo temporal donde yo estaba tratando (ya que no es el lugar correcto)

4

obtienes este error porque declaras en el permiso manifest.xml para escribir en el almacenamiento externo. necesitas agregar este permiso

también, Nunca escribas archivos (especialmente temporales) directamente en getExternalStorage().

Esto se colocará directamente en la tarjeta SD y creará un desastre. Para los archivos temporales que se sólo para ser visto por su propia aplicación debería utilizar:

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

reemplazar por su aplicación empaquetada, por ejemplo, com. Orabig.myFirstApp esa carpeta especial se elimina automáticamente del sistema si el usuario desinstala la aplicación, manteniendo el sistema libre de archivos temporales.

edición:

Tenga en cuenta que mi manifiesta no incluye el

es necesario!

edición: También, si la creación de archivos temporales de medios (por ejemplo PNG) es una buena práctica para crear un archivo vacío llamado .nomedia en esa carpeta. De esta forma evitará que el Escáner de Medios lo escanee y lo muestre en la galería.

última edición:

y antes de la creación de archivos se tiene que crear la carpeta llamando mkdirs() en el objeto del archivo.

+0

Supongo que quiere decir 'nuevo archivo (Environment.getExternalStorageDirectory(),"/Android/data//cache/temp_crop_file.png ");'? –

+0

Estaba señalando solo la carpeta. Luego creas cualquier archivo que desees allí. =] y no olvides que TIENES QUE DECLARAR en el manifiesto o de lo contrario siempre obtendrás un error. – Budius

+0

Gracias por el consejo sobre el directorio (buen punto) y .nomedia (muy buen punto). Sin embargo, no leyó cuidadosamente mi pregunta cuando dice "tiene que hacerlo". Mi primer código SI funciona, pero estoy preguntando: "¿por qué funciona?", No "¿qué tengo que hacer para que funcione?". :) –

12

tratan así ...

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

Editar:

para Pregunta 2

Puede ser cuestión de la siguiente enlace ...

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

+0

Lo intenté y tiene razón, funciona, y es un lugar mejor para los archivos temporales que el directorio externo. Sin embargo, esto no responde mis preguntas ... Por favor, vuelve a leer. –

Cuestiones relacionadas