Saltar al contenido

Android get storage path

Android guarda el archivo en el almacenamiento interno

Actualización 2019La información de este post está obsoleta. Por favor, consulte la documentación de Android para las actualizaciones sobre este tema.Con Motorola Solutions estamos ocupados terminando la primera ronda de cocinas de desarrolladores de Android en toda Europa. Justo a tiempo para preparar el Enterprise App Forum de Bruselas.

Lo mejor de estos eventos es la interacción con nuestros socios y sus problemas reales. La semana pasada recibí una pregunta interesante sobre nuestro TC55: ¿Cómo puedo obtener mediante programación la ruta de la tarjeta SD en el TC55?

Este no es un problema exclusivo del TC55, es un problema común en Android y hay diferentes maneras de manejarlo: Dado que tenemos el lujo de apuntar a sólo unos pocos dispositivos, el de Motorola Solutions :-), la mejor opción es utilizar las variables de entorno. Veamos qué ocurre en el TC55En este dispositivo, el uso de Environment.getExternalStorageDirectory(); devuelve diferentes resultados dependiendo de si se ha instalado o no una SDCard:¡Veamos qué podemos conseguir con las variables de entorno! Podemos entrar en un TC55 y utilizar el comando printenv:adb shell

Ruta de almacenamiento externo de Android

Un requisito común para las aplicaciones de Android es manipular archivos: guardar imágenes, descargar documentos o exportar datos para compartirlos con otros programas. Android (que está basado en Linux) soporta esto proporcionando espacio para el almacenamiento de archivos. Android agrupa el sistema de archivos en dos tipos diferentes de almacenamiento:

Estas agrupaciones son sólo conceptuales, y no se refieren necesariamente a una única partición o directorio en el dispositivo. Un dispositivo Android siempre proporcionará una partición para el almacenamiento interno y el almacenamiento externo. Es posible que algunos dispositivos tengan varias particiones que se consideren almacenamiento externo. Independientemente de la partición, las APIs para leer, escribir o crear archivos son las mismas. Hay dos conjuntos de API que una aplicación de Xamarin.Android puede utilizar para acceder a los archivos:

La lectura y escritura en archivos es casi idéntica en Xamarin.Android que en cualquier otra aplicación .NET. La aplicación de Xamarin.Android determina la ruta del archivo que se va a manipular y, a continuación, utiliza los modismos estándar de .NET para el acceso a los archivos. Dado que las rutas reales al almacenamiento interno y externo pueden variar de un dispositivo a otro o de una versión de Android a otra, no se recomienda codificar la ruta a los archivos. En su lugar, utilice las API de Xamarin.Android para determinar la ruta de acceso a los archivos. De este modo, las API de .NET para leer y escribir archivos exponen las API nativas de Android que ayudarán a determinar la ruta de acceso a los archivos en el almacenamiento interno y externo.

Android 11 /storage/emulated/0

Esto es lo que estoy tratando de lograr. En mi aplicación hay una opción para que el usuario seleccione una carpeta y la guarde para que un servicio copie los archivos en ella en segundo plano siempre que se cumpla una determinada condición. Así que básicamente el usuario selecciona la carpeta una vez y se olvida de ella.

Esta carpeta puede estar en una tarjeta SD externa, por lo que no puedo utilizar el habitual File.DirRootExternal para obtener la ruta y realizar la copia. Gracias al código compartido en la comunidad he podido hacerlo utilizando el intent ACTION_OPEN_DOCUMENT_TREE.

El problema es que devuelve una URI y no una ruta física como /storage/emulated/0/ etc… Aunque puedo realizar las opciones de copia con éxito con URI y flujos (File.Copy2), todavía necesito mostrar la ruta física completa a la carpeta que el usuario ha seleccionado para que pueda asegurarse de que la ruta es correcta. Y una ruta URI como content://com.android.externalstorage.documents/ no tendrá sentido para él. Tiene que estar en el formato /storage/emulated/0/.

He probado el código publicado aquí, pero se bloquea al probar en Android 7.0. La uri probada fue (HierarchicalUri) content://com.android.externalstorage.documents/tree/primary%3ADCIM. La URI es la de una carpeta en la tarjeta SD externa.

Ruta de acceso a Android

Puedo ver la carpeta de Documentos usando una variedad de herramientas en el dispositivo Android. Una herramienta afirma que la ruta es ‘/Documentos’. Otra afirma que la ruta es ‘/storage/emulated/0/Documents’. Ninguna de las dos rutas funciona cuando se utiliza en mi aplicación Android Delphi. Ya no puedo ver los archivos en la carpeta Documentos.

Desde el nivel 21 de la API, las aplicaciones que necesitan permiso para el almacenamiento externo (que es a lo que apunta TPath.GetSharedDocumentsPath), necesitan solicitar el permiso en tiempo de ejecución. Para un ejemplo de cómo hacer esto, eche un vistazo a esta demostración:

No necesitas solicitar permiso para TPath.GetDocumentsPath, así que no tengo ni idea de por qué no te funciona esa carpeta. ¿Está intentando acceder a los archivos que se están desplegando allí (es decir, tienen entradas en el Gestor de despliegue)?

He intentado utilizar TPath.GetSharedDocumentsPath, pero eso resuelve a /storage/emulated/0/Documents, que está vacío.    No hay archivos visibles, aunque sé que la carpeta Documentos contiene unos 100 archivos.    Estos archivos siempre han sido visibles en el pasado.

0/5 (0 Reviews)