sdcard memoria ficheros externa android file android-sdcard android-file

android - memoria - file:/sdcard/



Cómo obtener la ruta de sdcard interna y externa en Android (8)

Cómo obtener la ruta de sdcard interna y externa en Android

Métodos para almacenar en almacenamiento interno:

File getDir (String name, int mode) File getFilesDir ()

Los métodos anteriores están presentes en la clase de Context

Métodos para almacenar en la memoria interna del teléfono:

File getExternalStorageDirectory () File getExternalFilesDir (String type) File getExternalStoragePublicDirectory (String type)

Al principio, todos usaban Environment.getExternalStorageDirectory() , que apuntaba a la raíz de la memoria interna del teléfono. Como resultado, el directorio raíz se llenó con contenido aleatorio.

Posteriormente, se agregaron estos dos métodos:

En la clase de Context , agregaron getExternalFilesDir() , apuntando a un directorio específico de la aplicación en la memoria interna del teléfono. Este directorio y su contenido se eliminarán cuando la aplicación se desinstale.

Environment.getExternalStoragePublicDirectory() para lugares centralizados para almacenar tipos de archivos conocidos, como fotos y películas. Este directorio y su contenido NO se eliminarán cuando la aplicación se desinstale.

Métodos para almacenar en almacenamiento extraíble, es decir, tarjeta micro SD

Antes del nivel de API 19, no había forma oficial de almacenar en la tarjeta SD. Pero muchos podrían hacerlo usando APIs no oficiales.

Oficialmente, se introdujo un método en la clase de Context en el nivel de API 19 (versión de Android 4.4 - Kitkat).

File[] getExternalFilesDirs (String type)

Devuelve las rutas absolutas a los directorios específicos de la aplicación en todos los dispositivos de almacenamiento compartido / externo donde la aplicación puede colocar los archivos persistentes que posee. Estos archivos son internos a la aplicación y no son típicamente visibles para el usuario como medio.

Eso significa que devolverá las rutas tanto a la tarjeta Micro SD como a la memoria interna. En general, la segunda ruta devuelta sería la ruta de almacenamiento de la tarjeta micro SD.

La terminología de almacenamiento interno y externo según Google / documentos oficiales de Android es bastante diferente de lo que pensamos.

La mayoría de los nuevos dispositivos Android tienen una tarjeta SD interna y una tarjeta SD externa. Quiero crear una aplicación de explorador de archivos, pero no puedo encontrar la forma de utilizar la ruta de acceso en mi aplicación porque

File file = Environment.getExternalStorageDirectory();

simplemente regresa en la mayoría de dispositivos /mnt/sdcard pero hay otra ruta para la otra tarjeta /storage1 or /storage2 externa como /storage1 or /storage2 . Cualquier ayuda apreciada.


pero hay otra ruta para la otra tarjeta sd externa como / storage1 o / storage2

No hay nada en el SDK de Android, al menos a través de Android 4.1, que le permita acceder a esas rutas. De todos modos, es posible que su aplicación no los pueda leer o escribir. El comportamiento de tales ubicaciones de almacenamiento, y para qué se utilizan, depende de los fabricantes de dispositivos.


Como no hay un directorio directo para obtener las rutas, la solución puede ser Escanear el archivo /system/etc/vold.fstab y buscar líneas como esta: dev_mount sdcard / mnt / sdcard 1 /devices/platform/s3c-sdhci.0/ mmc_host / mmc0

Cuando encuentre uno, divídalo en sus elementos y luego extraiga la ruta hacia ese punto de montaje y agréguelo al arraylist

el texto resaltado a algunos dispositivos les falta el archivo vold por completo, por lo que agregamos una ruta aquí para asegurarnos de que la lista siempre incluya la ruta a la primera tarjeta SD, ya sea real o emulada.

sVold.add("/mnt/sdcard"); try { Scanner scanner = new Scanner(new File("/system/etc/vold.fstab")); while (scanner.hasNext()) { String line = scanner.nextLine(); if (line.startsWith("dev_mount")) { String[] lineElements = line.split(" "); String element = lineElements[2]; if (element.contains(":")) element = element.substring(0, element.indexOf(":")); if (element.contains("usb")) continue; // don''t add the default vold path // it''s already in the list. if (!sVold.contains(element)) sVold.add(element); } } } catch (Exception e) { // swallow - don''t care e.printStackTrace(); } }

Ahora que tenemos una lista limpia de rutas de montaje, pruebe cada una para asegurarse de que sea una ruta válida y disponible. Si no lo está, quítalo de la lista.

private static void testAndCleanList() { for (int i = 0; i < sVold.size(); i++) { String voldPath = sVold.get(i); File path = new File(voldPath); if (!path.exists() || !path.isDirectory() || !path.canWrite()) sVold.remove(i--); } }


No estoy seguro de la respuesta general, pero lo probé en un motorola XT830C con Android 4.4 y en un Nexus 7 Android 6.0.1. y en un Samsung SM-T530NU Android 5.0.2. Utilicé System.getenv("SECONDARY_STORAGE") y Environment.getExternalStorageDirectory().getAbsolutePath() .
El Nexus que no tiene una segunda tarjeta SD, System.getenv devuelve nulo y Envirnoment.getExterna... da / almacenamiento / emulado / 0.
El dispositivo motorola que tiene una tarjeta SD externa proporciona / storage / sdcard1 para System.getenv("SECONDARY_STORAGE") y Envirnoment.getExterna... entrega / storage / emulated / 0.
El samsumg devuelve / storage / extSdCard para la SD externa.
En mi caso, estoy haciendo un subdirectorio en la ubicación externa y estoy usando

appDirectory = (System.getenv("SECONDARY_STORAGE") == null) ? Environment.getExternalStorageDirectory().getAbsolutePath() : System.getenv("SECONDARY_STORAGE");

para encontrar la sdcard. Hacer un subdirectorio en este directorio está funcionando.
Por supuesto, tuve que configurar el permiso en el archivo de manifiesto para acceder a la memoria externa.
También tengo una tableta de color Nook 8 ". Cuando tenga la oportunidad de probarlos, publicaré si tengo algún problema con este enfoque.


No hay una API pública para obtener una ruta de sdcard interna / externa.

Pero existe una api de plataforma llamada StorageManager en el paquete android.os.storage. ver http://goo.gl/QJj1eu .

Hay algunas características como el almacenamiento de listas, el almacenamiento de montaje / desmontaje, el estado de montaje de obtención, la ruta de acceso de almacenamiento, etc.

Pero está oculta en la API y debe estar obsoleta o rota en la próxima versión de Android.

Y algunos métodos necesitan un permiso especial, y la mayoría no están documentados.


Prueba este código te ayudará

Map<String, File> externalLocations = ExternalStorage.getAllStorageLocations(); File sdCard = externalLocations.get(ExternalStorage.SD_CARD); File externalSdCard = externalLocations.get(ExternalStorage.EXTERNAL_SD_CARD);


Sí. Un fabricante diferente usa un nombre de tarjeta SD diferente, como en Samsung Tab 3, su extsd, y otros dispositivos samsung usan una tarjeta sd, como este fabricante diferente usa nombres diferentes.

Tenía el mismo requisito que tú. Así que he creado un ejemplo de ejemplo para usted desde mi proyecto. Vaya a este enlace . Ejemplo de selector de directorio de Android que utiliza 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 ver un ejemplo completo, vaya al vínculo Selector de directorio de Android

/** * Returns the path to internal storage ex:- /storage/emulated/0 * * @return */ private String getInternalDirectoryPath() { return Environment.getExternalStorageDirectory().getAbsolutePath(); } /** * Returns the SDcard storage path for samsung ex:- /storage/extSdCard * * @return */ private String getSDcardDirectoryPath() { return System.getenv("SECONDARY_STORAGE"); } mSdcardLayout.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { String sdCardPath; /*** * Null check because user may click on already selected buton before selecting the folder * And mSelectedDir may contain some wrong path like when user confirm dialog and swith back again */ if (mSelectedDir != null && !mSelectedDir.getAbsolutePath().contains(System.getenv("SECONDARY_STORAGE"))) { mCurrentInternalPath = mSelectedDir.getAbsolutePath(); } else { mCurrentInternalPath = getInternalDirectoryPath(); } if (mCurrentSDcardPath != null) { sdCardPath = mCurrentSDcardPath; } else { sdCardPath = getSDcardDirectoryPath(); } //When there is only one SDcard if (sdCardPath != null) { if (!sdCardPath.contains(":")) { updateButtonColor(STORAGE_EXTERNAL); File dir = new File(sdCardPath); changeDirectory(dir); } else if (sdCardPath.contains(":")) { //Multiple Sdcards show root folder and remove the Internal storage from that. updateButtonColor(STORAGE_EXTERNAL); File dir = new File("/storage"); changeDirectory(dir); } } else { //In some unknown scenario at least we can list the root folder updateButtonColor(STORAGE_EXTERNAL); File dir = new File("/storage"); changeDirectory(dir); } } });


File main=new File(String.valueOf(Environment.getExternalStorageDirectory().getAbsolutePath())); File[]t=main.getParentFile().listFiles(); for(File dir:t) { Log.e("Main",dir.getAbsolutePath()); }

Salida:

E/Main: /storage/sdcard1 E/Main: /storage/sdcard0

Tengo una tarjeta SD y memoria incorporada.