versiones studio pie developer descargar app android

pie - android studio



Environment.getExternalStorageDirectory no devuelve la ruta al almacenamiento extraíble (2)

Para API 17 obtengo los siguientes retornos:

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.

A partir del API nivel 8, parece que Android ha redefinido qué es el almacenamiento "externo". 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í. Este directorio puede mejor ser pensado como medios / almacenamiento compartido ... En dispositivos con múltiples directorios de almacenamiento "externos" ..., este directorio representa el almacenamiento externo "primario" con el que el usuario interactuará ".

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


De acuerdo con la fuente , getExternalStorageDirectory se implementa para devolver lo que esté configurado 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. Puede no ser nulo .

por lo tanto, 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: Encuentre una ubicación de tarjeta SD externa , no hay forma de obtener directamente la tarjeta sd externa (si es que existe).

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