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)