android - samsung - porque no se guardan las fotos en mi memoria
Ruta de sdcard de almacenamiento extraíble(externa) por los fabricantes (5)
He estado buscando en Google, pero es muy difícil encontrar qué fabricantes / modelos usan qué camino para la tarjeta sd / almacenamiento externo.
- No estoy hablando de la ruta de almacenamiento interno que se puede encontrar mediante:
Environment.getExternalStorageDirectory()
Sé que getExternalStorageDirectory()
veces apunta a una tarjeta getExternalStorageDirectory()
externa en algunos dispositivos.
Esto es lo que he encontrado una ruta común para la ruta externa (No estoy seguro de qué fabricante utiliza qué ruta):
/emmc
/mnt/sdcard/external_sd
/mnt/external_sd
/sdcard/sd
/mnt/sdcard/bpemmctest
/mnt/sdcard/_ExternalSD
/mnt/sdcard-ext
/mnt/Removable/MicroSD
/Removable/MicroSD
/mnt/external1
/mnt/extSdCard
/mnt/extsd
/mnt/usb_storage <-- usb flash mount
/mnt/extSdCard <-- usb flash mount
/mnt/UsbDriveA <-- usb flash mount
/mnt/UsbDriveB <-- usb flash mount
Esto es lo que encontré buscando en Google.
Necesito escanear todo el almacenamiento interno + externo + memoria USB para buscar un determinado archivo. Si me falta alguna ruta, por favor agréguela a la lista anterior. Si alguien conoce las rutas utilizadas por cada fabricante, por favor, comparta con nosotros.
¡Buenas noticias! En KitKat ahora hay una API pública para interactuar con estos dispositivos secundarios de almacenamiento compartido.
Los nuevos Context.getExternalFilesDirs()
y Context.getExternalCacheDirs()
pueden devolver varias rutas, incluidos los dispositivos primarios y secundarios. A continuación, puede iterar sobre ellos y comprobar Environment.getStorageState()
y File.getFreeSpace()
para determinar el mejor lugar para almacenar sus archivos. Estos métodos también están disponibles en ContextCompat
en la biblioteca support-v4.
También tenga en cuenta que si solo está interesado en utilizar los directorios devueltos por Context
, ya no necesita los READ_
o WRITE_EXTERNAL_STORAGE
. En el futuro, siempre tendrá acceso de lectura / escritura a estos directorios sin necesidad de permisos adicionales.
Las aplicaciones también pueden seguir trabajando en dispositivos más antiguos al finalizar su solicitud de permiso de esta manera:
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
En función de las rutas proporcionadas por oceanuz, escribí un método que ubica la ruta de almacenamiento externo (ignorando el caso) y lo devuelve como una cadena.
Nota: StreamSupport biblioteca StreamSupport dentro de mi método, por lo que para que funcione, deberá descargar el archivo jar y agregarlo a la carpeta libs en su proyecto, y eso es todo.
public static String getExternalSdPath(Context context) {
List<String> listOfFoldersToSearch = Arrays.asList("/storage/", "/mnt/", "/removable/", "/data/");
List<String> listOf2DepthFolders = Arrays.asList("sdcard0", "media_rw", "removable");
List<String> listOfExtFolders = Arrays.asList("sdcard1", "extsdcard", "external_sd", "microsd", "emmc", "ext_sd", "sdext",
"sdext1", "sdext2", "sdext3", "sdext4");
final String[] thePath = {""};
Optional<File> optional = StreamSupport.stream(listOfFoldersToSearch)
.filter(s -> {
File folder = new File(s);
return folder.exists() && folder.isDirectory();
}) //I got the ones that exist and are directories
.flatMap(s -> {
try {
List<File> files = Arrays.asList(new File(s).listFiles());
return StreamSupport.stream(files);
} catch (NullPointerException e) {
return StreamSupport.stream(Collections.emptyList());
}
}) //I got all sub-dirs of the main folders
.flatMap(file1 -> {
if (listOf2DepthFolders.contains(file1.getName().toLowerCase())) {
try {
List<File> files = Arrays.asList(file1.listFiles());
return StreamSupport.stream(files);
} catch (NullPointerException e) {
return StreamSupport.stream(Collections.singletonList(file1));
}
} else
return StreamSupport.stream(Collections.singletonList(file1));
}) //Here I got all the 2 depth and 3 depth folders
.filter(o -> listOfExtFolders.contains(o.getName().toLowerCase()))
.findFirst();
optional.ifPresent(file -> thePath[0] = file.getAbsolutePath());
Log.i("Path", thePath[0]);
return thePath[0];
}
Este método devolverá una cadena vacía si no se encuentra una ruta de tarjeta Sd.
Estaba tratando de encontrar la ruta a mi tarjeta SD externa en Sony Xperia XA. Luego instalé ES File explorer y eso claramente mostró la ruta a cualquier carpeta, interna o externa, en su ventana de características. Encontré la ruta a SD externo como / storage / C4EE-F3A3. Estaba intentando guardar el archivo de salida de Python3 a SD externa, pero no tenía permiso para guardar en ninguna otra ubicación que no fuera la carpeta Qpython en la SD interna.
Has probado:
Environment.getExternalStoragePublicDirectory.getExternalStorageDirectory(String type);
Donde tipo es el directorio definido por Android, necesitas Environment.DIRECTORY_DOWNLOADS, que te dará el directorio de descarga
No es "getExternalStorageDirectory" sino "getExternalStoragePublicDirectory". Tenga en cuenta que para cada dispositivo Android devolverá el lugar donde ocurre el almacenamiento (por ejemplo: / mnt / external_sd) trabajado en mi transformador 101, un nexus 10 y un galaxy s2. Lo necesitaba para descargar un archivo en el almacenamiento
Aquí está la documentación http://developer.android.com/reference/android/os/Environment.html
También comencé con una lista como la tuya de algún lado (lo siento, no pude encontrar la fuente original) y sigo agregando algunas rutas recopiladas a partir de los comentarios de los usuarios. Hay duplicados en la lista anterior.
/storage/sdcard1 //!< Motorola Xoom
/storage/extsdcard //!< Samsung SGS3
/storage/sdcard0/external_sdcard // user request
/mnt/extsdcard
/mnt/sdcard/external_sd //!< Samsung galaxy family
/mnt/external_sd
/mnt/media_rw/sdcard1 //!< 4.4.2 on CyanogenMod S3
/removable/microsd //!< Asus transformer prime
/mnt/emmc
/storage/external_SD //!< LG
/storage/ext_sd //!< HTC One Max
/storage/removable/sdcard1 //!< Sony Xperia Z1
/data/sdext
/data/sdext2
/data/sdext3
/data/sdext4
/sdcard1 //Sony Xperia Z
/sdcard2 //HTC One M8s
/storage/microsd //ASUS ZenFone 2
Por lo que quiere lograr (escaneando todas las rutas posibles para ciertos archivos), creo que es completamente imposible hacerlo de esta manera (usando una lista de rutas conocidas). Algunas rutas en el mismo dispositivo incluso cambiaron entre la actualización de Android.