2011-05-18 13 views
38

A partir del nivel 8 de la API, parece que Android ha redefinido el almacenamiento "externo". Leyendo a través del http://developer.android.com/reference/android/os/Environment.html, adjunto a la documentación para getExternalStorageDirectory Veo el comentario: "No se confunda con la palabra 'externo' aquí. Este directorio se puede considerar mejor como medio/almacenamiento compartido ... En dispositivos con múltiples 'externos' directorios de almacenamiento ..., este directorio representa el almacenamiento externo "primario" con el que el usuario interactuará ".Environment.getExternalStorageDirectory no devuelve la ruta al almacenamiento extraíble

Mi aplicación escribe archivos en la ruta obtenida por getExternalStorageDirectory, y he tenido usuarios que solicitan una opción para escribir en su tarjeta extraíble. Siempre había supuesto que getExternalStorageDirectory devolvía la ruta a la tarjeta SD extraíble, pero esto ya no es cierto. ¿Cómo accedo a la ruta de esta tarjeta SD?

Respuesta

30

According to the source, getExternalStorageDirectory se implementa para devolver lo que se establece como "almacenamiento externo" en el entorno del dispositivo:

public static File getExternalStorageDirectory() { 
    return EXTERNAL_STORAGE_DIRECTORY; 
} 

y EXTERNAL_STORAGE_DIRECTORY es:

private static final File EXTERNAL_STORAGE_DIRECTORY 
     = getDirectory("EXTERNAL_STORAGE", "/sdcard"); 

static File getDirectory(String variableName, String defaultPath) { 
    String path = System.getenv(variableName); 
    return path == null ? new File(defaultPath) : new File(path); 
} 

En contraste, getExternalStoragePublicDirectory(String type) requiere uno de estos cadenas:

DIRECTORY_MUSIC, D IRPORTORY_PODCASTS, DIRECTORY_RINGTONES, DIRECTORY_ALARMS, DIRECTORY_NOTIFICATIONS, DIRECTORY_PICTURES, DIRECTORY_MOVIES, DIRECTORY_DOWNLOADS, o DIRECTORY_DCIM. Puede no ser nulo.

por lo que no está destinado a devolver la raíz de la tarjeta SD.

Una alternativa:

Finalmente, getExternalStorageState() devolverá el sistema de archivos montado en /mnt/sdcard/. Según CommonsWare en esta respuesta: Find an external SD card location, no hay forma de obtener directamente la tarjeta sd externa (si es que existe).

Una alternativa sería marcar isExternalStorageRemovable() y dar una opción manual si es falsa.

+0

BTW: No vi su edición eliminando la parte de la pregunta 'getExternalStoragePublicDirectory' hasta ahora. – Aleadam

+2

Lo siento, lo eliminé y proporcioné un mensaje de edición que explicaba que lo había eliminado, pero supongo que no se muestran los mensajes de edición. Dado que no hay forma de obtener la ubicación de la tarjeta SD extraíble, si existe, ¿cuál es el propósito de esta ranura para tarjetas SD en teléfonos como Atrix? ¿Es solo para almacenar datos mientras está montado en una computadora, como una memoria USB? – skyler

+0

@skyler está bien, simplemente no quería que mi respuesta pareciera fuera de contexto. Honestamente, es una opción mucho mejor que la SD interna. Es más rápido, más confiable y sabes que siempre está ahí. Pero si lo solicitan, brinde una opción manual como dije antes (un cuadro de diálogo Guardar como). Por ejemplo, en mi captivate, el interno es '/ sdcard' y el externo es'/sdcard/external_sd/' – Aleadam

1

Para API 17 me sale el siguiente rendimientos:

Environment.getExternalStoragePublicDirectory(Environment.MEDIA_MOUNTED) 
returns:-------> /storage/sdcard0/mounted 

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) 
returns:-------> /storage/sdcard0/DCIM 

Environment.getExternalStoragePublicDirectory(Environment.MEDIA_SHARED) 
returns:-------> /storage/sdcard0/shared 

Environment.MEDIA_MOUNTED 
returns:-------> mounted 

Environment.getExternalStorageDirectory() 
returned:-------> /storage/sdcard0 

Todo lugar de retorno de la memoria interna del teléfono.

Cuestiones relacionadas