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.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.