Environment.getExternalStorageDirectory no devuelve la ruta al almacenamiento extraíble
A partir del nivel API 8, parece que Android ha redefinido lo que es "externo" de almacenamiento. Leyendo a través de http://developer.android.com/reference/android/os/Environment.html , adjunto a la documentación de getExternalStorageDirectory
veo el comentario: "no se confunda con la palabra" externo "aquí. Mejor ser pensado como medios / almacenaje compartido … En los dispositivos con los directorios múltiples del almacenaje "externos" …, este directorio representa el almacenaje externo "primario" con el cual el usuario interactuará. "
Mi aplicación escribe archivos en la ruta obtenida por getExternalStorageDirectory
y he pedido a los usuarios que escriban una opción en su tarjeta SD extraíble. Siempre he asumido que getExternalStorageDirectory
devolvió la ruta a la tarjeta SD extraíble, pero esto ya no es cierto. ¿Cómo accedo a la ruta de acceso a esta tarjeta SD?
De acuerdo con la fuente , getExternalStorageDirectory
se implementa para devolver lo que se establezca 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); }
Por el contrario, getExternalStoragePublicDirectory(String type)
requiere una de estas cadenas:
DIRECTORY_MUSIC, DIRECTORY_PODCASTS, DIRECTORY_RINGTONES, DIRECTORY_ALARMS, DIRECTORY_NOTIFICATIONS, DIRECTORY_PICTURES, DIRECTORY_MOVIES, DIRECTORY_DOWNLOADS o DIRECTORY_DCIM. No puede 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/
. De acuerdo con CommonsWare en esta respuesta: Encontrar una ubicación de tarjeta externa SD , no hay manera de obtener directamente la tarjeta SD externa (si existe).
Una alternativa sería comprobar isExternalStorageRemovable ()
y dar una opción manual si es falsa.
Para API 17 obtengo las siguientes devoluciones:
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
Todos devuelven la ubicación de la memoria interna del teléfono.