Samsung Galaxy S3 tiene una ranura para tarjeta SD externa, que está montada en /mnt/extSdCard
.
¿Cómo puedo obtener este camino por algo como Environment.getExternalStorageDirectory()
?
Esto volverá mnt/sdcard
y no puedo encontrar la API para la tarjeta SD externa. (O almacenamiento USB extraíble en algunas tabletas).
android
android-sdcard
Romulus Urakagi Ts'ai
fuente
fuente
Respuestas:
Tengo una variación de una solución que encontré aquí.
El método original fue probado y trabajado con
No estoy seguro de en qué versión de Android estaban cuando se probaron.
He probado mi versión modificada con
y algunos dispositivos de almacenamiento únicos que utilizan una tarjeta SD como almacenamiento principal
Excepto el Increíble, todos estos dispositivos solo devolvieron su almacenamiento extraíble. Probablemente deba hacer algunas comprobaciones adicionales, pero esto es al menos un poco mejor que cualquier solución que haya encontrado hasta ahora.
fuente
Encontré una forma más confiable de obtener rutas a todas las SD-CARD en el sistema. Esto funciona en todas las versiones de Android y devuelve las rutas a todos los almacenamientos (incluido el emulado).
Funciona correctamente en todos mis dispositivos.
PD: Basado en el código fuente de la clase Environment.
fuente
Pattern
para/
System.getenv("SECONDARY_STORAGE")
regresa/storage/sdcard1
. Esa ubicación no existe, pero la ubicación real es/storage/42CE-FD0A
, donde 42CE-FD0A es el número de serie del volumen de la partición formateada.Supongo que para usar la tarjeta sd externa necesitas usar esto:
O
en tu caso...
en reemplazo de
Environment.getExternalStorageDirectory()
Funciona para mi. Primero debe verificar lo que está en el directorio mnt y trabajar desde allí.
Debería utilizar algún tipo de método de selección para elegir qué sdcard utilizar:
fuente
Para recuperar todos los almacenamientos externos (ya sean tarjetas SD o almacenamientos internos no extraíbles ), puede utilizar el siguiente código:
Alternativamente, puede usar System.getenv ("EXTERNAL_STORAGE") para recuperar el directorio de almacenamiento externo primario (por ejemplo, "/ storage / sdcard0" ) y System.getenv ("SECONDARY_STORAGE") para recuperar la lista de todos los directorios secundarios (por ejemplo, " / almacenamiento / extSdCard: / almacenamiento / UsbDriveA: / almacenamiento / UsbDriveB " ). Recuerde que, también en este caso, es posible que desee filtrar la lista de directorios secundarios para excluir las unidades USB.
En cualquier caso, tenga en cuenta que el uso de rutas codificadas de forma rígida siempre es un mal enfoque (especialmente cuando todos los fabricantes pueden cambiarlo a su gusto).
fuente
Estaba usando la solución de Dmitriy Lozenko hasta que comprobé un Asus Zenfone2 , Marshmallow 6.0.1 y la solución no funciona. La solución falló al obtener EMULATED_STORAGE_TARGET , específicamente para la ruta microSD, es decir: / storage / F99C-10F4 / . Edité el código para obtener las rutas raíz emuladas directamente desde las rutas de la aplicación emuladas
context.getExternalFilesDirs(null);
y agregué rutas físicas específicas del modelo de teléfono más conocidas .Para hacer nuestra vida más fácil, hice una biblioteca aquí . Puede usarlo a través del sistema de compilación gradle, maven, sbt y leiningen.
Si le gusta la forma antigua, también puede copiar y pegar el archivo directamente desde aquí , pero no sabrá si hay una actualización en el futuro sin verificarlo manualmente.
Si tiene alguna pregunta o sugerencia, hágamelo saber.
fuente
context.getExternalFilesDirs(null)
volveránull
para uno de los archivos y habrá una excepción en el siguiente ciclo. Sugiero agregarif (file == null) continue;
como la primera línea en el ciclo.¡Buenas noticias! En KitKat ahora hay una API pública para interactuar con estos dispositivos secundarios de almacenamiento compartido.
Los métodos nuevos
Context.getExternalFilesDirs()
yContext.getExternalCacheDirs()
pueden devolver varias rutas, incluidos los dispositivos primarios y secundarios. Luego, puede iterar sobre ellos y verificarEnvironment.getStorageState()
yFile.getFreeSpace()
determinar el mejor lugar para almacenar sus archivos. Estos métodos también están disponiblesContextCompat
en la biblioteca support-v4.También tenga en cuenta que si solo está interesado en usar los directorios devueltos por
Context
, ya no necesita los permisosREAD_
oWRITE_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 funcionando en dispositivos más antiguos al finalizar su solicitud de permiso de esta manera:
fuente
Hice lo siguiente para acceder a todas las tarjetas SD externas.
Con:
obtienes la ruta a la SD externa primaria Luego con:
obtiene el directorio principal del almacenamiento externo primario, y también es el principal de todos los sd externos. Ahora, puede enumerar todo el almacenamiento y seleccionar el que desee.
Espero que sea útil.
fuente
Así es como obtengo la lista de rutas de tarjetas SD (excluyendo el almacenamiento externo primario):
fuente
externalCacheDirs[0].getParentFile().getParentFile().getParentFile().getParentFile().getAbsolutePath()
Esta es una receta para el desastre. Si está haciendo esto, también puede codificar la ruta que desea, ya que, si obtiene un directorio de caché con cualquier cosa que no sea 4 padres, obtendrá NullPointerException o la ruta incorrecta.Gracias por las pistas proporcionadas por ustedes, especialmente @SmartLemon, tengo la solución. En caso de que alguien más lo necesite, pongo mi solución final aquí (para encontrar la primera tarjeta SD externa listada):
Si no hay una tarjeta SD externa allí, devuelve el almacenamiento a bordo. Lo usaré si la tarjeta sd no existe, es posible que deba cambiarla.
fuente
consulte mi código, espero que sea útil para usted:
fuente
En realidad, en algunos dispositivos, el nombre predeterminado de la tarjeta SD externa se muestra como
extSdCard
y en otrossdcard1
.Este fragmento de código ayuda a encontrar esa ruta exacta y le ayuda a recuperar la ruta del dispositivo externo.
fuente
Si. Diferentes fabricantes usan diferentes nombres de tarjetas SD como en Samsung Tab 3, su extsd, y otros dispositivos Samsung usan tarjetas sd como este fabricante diferente usan diferentes nombres.
Tenía el mismo requisito que tú. así que he creado un ejemplo de muestra para usted de mi proyecto, vaya a este enlace Ejemplo de selector de directorio de Android que usa la biblioteca androi-dirchooser. Este ejemplo detecta la tarjeta SD y enumera todas las subcarpetas y también detecta si el dispositivo tiene más de una tarjeta SD.
Parte del código se ve así. Para un ejemplo completo, vaya al enlace Selector de directorio de Android
fuente
Esta solución (recopilada a partir de otras respuestas a esta pregunta) maneja el hecho (como lo menciona @ono) que
System.getenv("SECONDARY_STORAGE")
no sirve de nada con Marshmallow.Probado y trabajando en:
Samsung Galaxy Tab A (Android 6.0.1 - Stock)
fuente
rawSecondaryStoragesStr.contains(path)
puede permitir que el almacenamiento interno también se agregue; mejor podemos eliminar esa condición. Me enfrenté a ese problema, ya que mi dispositivo devuelve el directorio de almacenamiento interno conSystem.getenv("SECONDARY_STORAGE")
, pero devuelve la ruta de la tarjeta de memoria externa conSystem.getenv(EXTERNAL_STORAGE)
en KitKat; parece que diferentes proveedores han implementado esto de manera diferente sin ningún maldito estándar ..En algunos dispositivos (por ejemplo, samsung galaxy sII), la tarjeta de memoria interna puede estar en vfat. En este caso use referir el último código, obtenemos la ruta de la tarjeta de memoria interna (/ mnt / sdcad) pero no la tarjeta externa. Consulte el código a continuación para resolver este problema.
fuente
fuente
Estoy seguro de que este código seguramente resolverá sus problemas ... Esto funciona bien para mí ... \
fuente
eso no es cierto. / mnt / sdcard / external_sd puede existir incluso si la tarjeta SD no está montada. su aplicación se bloqueará cuando intente escribir en / mnt / sdcard / external_sd cuando no esté montado.
primero debe verificar si la tarjeta SD está montada usando:
fuente
getExternalStorageState()
Creo que esto no tiene sentido cuando devuelve el almacenamiento interno en lugar de la tarjeta SD externa.fuente
Puede usar algo como: Context.getExternalCacheDirs () o Context.getExternalFilesDirs () o Context.getObbDirs (). Proporcionan directorios específicos de la aplicación en todos los dispositivos de almacenamiento externos donde la aplicación puede almacenar sus archivos.
Entonces, algo como esto: Context.getExternalCacheDirs () [i] .getParentFile (). GetParentFile (). GetParentFile (). GetParent () puede obtener la ruta raíz de los dispositivos de almacenamiento externos.
Sé que estos comandos tienen un propósito diferente, pero otras respuestas no funcionaron para mí.
Este enlace me dio buenos consejos: https://possiblemobile.com/2014/03/android-external-storage/
fuente
System.getenv("SECONDARY_STORAGE")
devuelve nulo para Marshmallow. Esta es otra forma de encontrar todos los directorios externos. Puede verificar si es extraíble, lo que determina si es interno / externofuente
Probé las soluciones proporcionadas por Dmitriy Lozenko y Gnathonic en mi Samsung Galaxy Tab S2 (Modelo: T819Y) pero ninguna me ayudó a recuperar la ruta a un directorio de tarjeta SD externo.
mount
La ejecución del comando contenía la ruta requerida al directorio externo de la tarjeta SD (es decir, / Storage / A5F9-15F4) pero no coincidía con la expresión regular, por lo que no se devolvió. No obtengo el mecanismo de nomenclatura de directorios seguido por Samsung. Por qué se desvían de los estándares (es decir, extsdcard) y se les ocurre algo realmente sospechoso como en mi caso (es decir, / Storage / A5F9-15F4) . ¿Hay algo que me esté perdiendo? De todos modos, siguiendo los cambios en la expresión regular de Gnathonic La solución me ayudó a obtener un directorio sdcard válido:No estoy seguro de si esta es una solución válida y si dará resultados para otras tabletas Samsung, pero ha solucionado mi problema por ahora. A continuación se muestra otro método para recuperar la ruta de la tarjeta SD extraíble en Android (v6.0). He probado el método con Android marshmallow y funciona. El enfoque utilizado en él es muy básico y seguramente también funcionará para otras versiones, pero las pruebas son obligatorias. Será útil tener una idea de ello:
Por favor, comparta si tiene algún otro enfoque para manejar este problema. Gracias
fuente
Esto obtendrá la ruta del almacenamiento secundario sd externo.
fuente
fuente
Para acceder a los archivos en mi tarjeta SD , en mi HTC One X (Android), uso esta ruta:
¡Tenga en cuenta el triple "/"!
fuente
En Galaxy S3 Android 4.3, la ruta que uso es ./storage/extSdCard/Card/ y hace el trabajo. Espero eso ayude,
fuente
Los siguientes pasos funcionaron para mí. Solo necesitas escribir estas líneas:
La primera línea le dará el nombre del directorio sd, y solo necesita usarlo en el método de reemplazo para la segunda cadena. La segunda cadena contendrá la ruta para el sd interno y extraíble (/ almacenamiento / en mi caso) . Solo necesitaba esta ruta para mi aplicación, pero puedes ir más allá si la necesitas.
fuente