2011-04-23 9 views
13

Tengo una aplicación que guarda los archivos descargados de un servidor. Estos archivos no son privados para mi aplicación y también deben ser accesibles para otras aplicaciones. Quiero saber cuál sería la ruta correcta para guardar estos archivos cuando la tarjeta SD está AUSENTE. Para la tarjeta SD, existe la API bien conocido -Guardar archivos públicos en el almacenamiento interno

getExternalStorageDirectory() 

Para los datos privados de la aplicación en la memoria interna no es -

Context.getFilesDir() 

En algunos dispositivos, la memoria interna está representado por/EMMC /.

Será muy útil si alguien puede explicar/emmc /. Sé que significa tarjeta de memoria incorporada y no está presente en todos los dispositivos. Pero, ¿es realmente representativo de la memoria interna? ¿O es el tercer recuerdo?

¿Debo guardar los archivos usando openFileOutput() con MODE_WORLD_READABLE?

Respuesta

9

En algunos dispositivos, la memoria interna está representada por/emmc /.

/emmc/ pueden existir en algunos dispositivos, y puede ser interna, pero puede no ser accesible a las aplicaciones, y ciertamente no es parte del SDK de Android a menos que pasa a ser lo getExternalStorageDirectory() devoluciones.

¿Pero es realmente representativo de la memoria interna?

o es la tercera memoria?

Pregunta al fabricante de tu dispositivo.

¿Debo guardar los archivos usando openFileOutput() con MODE_WORLD_READABLE?

Eso es imposible de responder en abstracto. Usted dice que sus archivos "también deberían ser accesibles para otras aplicaciones", pero no ha indicado por qué espera que a otra aplicación le importen un poco sus archivos. Otras aplicaciones no escanearán sus directorios en busca de archivos; en el mejor de los casos, permitirán que los usuarios exploren el almacenamiento externo. La única razón para tener un archivo que es MODE_WORLD_READABLE es si su aplicación activará otra aplicación para hacer algo con el archivo (por ejemplo, ACTION_VIEWIntent).

+0

Gracias CommonsWare! Sí, mi aplicación que activa otras aplicaciones con ACTION_VIEW es exactamente la razón por la que llamo públicos a estos archivos. Además, como algunos exploradores de archivos y aplicaciones escanean tanto la tarjeta SD como la memoria interna, quiero que puedan encontrar estos archivos. Entonces, mi pregunta sigue siendo, ¿dónde guardar el archivo en caso de que no se encuentre la tarjeta SD? – Akshay

+0

@Akshay: "Además, como algunos exploradores de archivos y aplicaciones escanean tanto la tarjeta SD como la memoria interna, quiero que puedan encontrar estos archivos". - Eso no es posible, o si lo es, es un gran agujero de seguridad. "Entonces, mi pregunta sigue siendo, ¿dónde guardar el archivo en caso de que no se encuentre la tarjeta SD?" - 'getFilesDir()'. – CommonsWare

+0

¡Gracias CommonsWare! Estoy tratando de entender esto claramente. Mi aplicación se puede comparar con un cliente de correo electrónico que descarga archivos adjuntos y permite a los lectores de documentos y reproductores multimedia abrir estos archivos. ¿Dónde podría un cliente de correo electrónico guardar los archivos si la tarjeta SD está ausente? ¿No hay un directorio público en la memoria interna? Algo como/internal_memory/downloads? ¿Por qué consideraría escanear la memoria interna como un agujero de seguridad? Solo para confirmar, la memoria interna implica la memoria del dispositivo/teléfono, ¿verdad? Perdón por la ráfaga de preguntas. – Akshay

14

Me doy cuenta de que esto es viejo y tiene una respuesta aceptada, pero creo que la pregunta sigue siendo relevante y que hay una manera de lograr lo que quiere el asker.

Para parafrasear, creo que el asker quiere guardar un archivo y hacerlo accesible (por ejemplo, para verlo) por otras aplicaciones, sin tener que pensar en el almacenamiento externo (por ejemplo, un permiso adicional y la posibilidad de que el almacenamiento externo no presente).

Resulta que puede hacer sus propios archivos legibles por otras aplicaciones.

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); 

El setReadable hizo el trabajo código anterior para mí - y sin que la línea de la aplicación de visor no se pudo leer el archivo. Tenga en cuenta que setReadable opera en todo el directorio, por lo que la mejor solución es, probablemente, crear un nombre de subdirectorio 'public' y poner sus archivos allí.

+3

¡Tu eres un salvavidas! La respuesta aceptada se centra demasiado en por qué no debería hacer esto y no en cómo. –

Cuestiones relacionadas