Migración completa de datos en relación al almacenamiento de ámbito en Android 11 y la compatibilidad con versiones < Android 10.
Android 11 ha vuelto obsoletas casi todas mis aplicaciones debido a la actualización del almacenamiento controlado.
De acuerdo, empezaré diciendo lo siguiente:
Opción #1 – android:requestLegacyExternalStorage=”true” no funcionó para mí, a pesar de que todavía estoy apuntando al sdk 29.
Opción #2 –
No importa mucho de todos modos, ya que la opción #1 solo funcionaría temporalmente y la opción #2 tendría que ser justificada al publicar en la tienda.
Ahora me deja con la Opción #3 – migrar todos mis datos al almacenamiento controlado.
Mi aplicación básicamente hace 3 cosas:
- Copiar una carpeta llamada “Test” desde la carpeta de activos al Environment.getExternalStorageDirectory() porque necesito una ruta de tipo String.
- Generar una imagen y escribirla en Environment.getExternalStorageDirectory().
- Leer la imagen guardada desde Environment.getExternalStorageDirectory().
Ahora mis preguntas:
1) ¿Dado que necesito una ruta de tipo String, debo copiar la carpeta llamada “Test” desde la carpeta de activos al almacenamiento controlado? En ese caso, ¿cómo lo hago? ¿O hay otra manera?
2) ¿Cómo guardo un bitmap en el almacenamiento controlado? ¿Debo seguir este tutorial: https://www.youtube.com/watch?v=tYQ8AO58Aj0?
3) ¿Cómo leo el archivo guardado en el almacenamiento controlado?
4) Si hago todos los ajustes anteriores, ¿funcionarán para todas las versiones de Android? ¿O básicamente necesito verificar la versión de Android y usar Environment.getExternalStorageDirectory() para <10 y almacenamiento controlado para >= 10?
davy.ai
Como experto en TI especializado en Java, Android, Android-11, Android-Storage y Scoped-Storage, puedo responder las siguientes preguntas:
1) Si necesitas una ruta de cadena, puedes copiar la carpeta llamada Test desde la carpeta de activos al almacenamiento con alcance limitado mediante el uso del
Storage Access Framework
, que te permite copiar contenido de otras aplicaciones y directorios de manera segura. Puedes utilizar elACTION_OPEN_DOCUMENT_TREE
intent para otorgar acceso al directorio y luego copiar el archivo a ese directorio.2) Para guardar un mapa de bits en el almacenamiento con alcance limitado, puedes utilizar la clase
ContentResolver
para crear un nuevo archivo y luego utilizar unOutputStream
para escribir los datos del mapa de bits en el archivo. Aquí tienes un fragmento de código como referencia:3) Para leer el archivo guardado desde el almacenamiento con alcance limitado, puedes utilizar la clase
ContentResolver
para consultar el proveedor y obtener laUri
del archivo. Luego, utiliza unInputStream
para leer el contenido del archivo. Aquí tienes un fragmento de código como referencia:4) Si realizas todos los ajustes anteriores, funcionarán en todas las versiones de Android, incluyendo Android 10 y versiones posteriores. Sin embargo, aún debes verificar la versión de Android y utilizar
Environment.getExternalStorageDirectory()
para versiones anteriores o Scoped Storage para versiones más recientes para garantizar la compatibilidad con versiones anteriores.