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.