Ya no busques más por todo internet ya que has llegado al sitio necesario, tenemos la solución que quieres pero sin problema.
Solución:
Pero ahora, cuando me dirijo a SdkVersion 30, esto ya no parece funcionar
Eso es correcto. Android 11 (API 30+) requestLegacyExternalStorage=true
no hace nada y ya no puede “optar por no participar”. Estaba disponible en Android 10 para brindarles a los desarrolladores un período de transición/gracia para poder migrar al modelo de almacenamiento con alcance.
opción 1: migre los datos en su aplicación mientras aún apunta a la API 29, luego, una vez que los datos migrados sean compatibles con el almacenamiento de alcance, debería poder lanzar una actualización dirigida a la API 30: https://developer.android.com/preview/ privacidad/almacenamiento#almacenamiento en ámbito.
Esto puede tener sus propios problemas si los usuarios omiten esta versión y actualizan directamente de una versión anterior a la más reciente y te quedas con datos no migrados a los que no puedes acceder.
opción 2: parece que Google ve esta advertencia obvia y ha incluido una preserveLegacyExternalStorage=true
opción al apuntar API 30 para permitirle migrar datos. https://developer.android.com/reference/android/R.attr#preserveLegacyExternalStorage
En el futuro, puede hacer referencia a esta tabla para decidir qué “marco” de almacenamiento usar en función del caso de uso: https://developer.android.com/training/data-storage
Existe la posibilidad de que algunas aplicaciones simplemente no puedan migrar con éxito, en función de cómo interactuaron con el File
api como solución de Google no abarcará todos los casos de uso actuales y es posible que no haya una ruta de migración.
Por ejemplo, lancé una aplicación hace un par de años que permitía a los usuarios actualizar las carátulas de los álbumes usando MediaStore
y ContentResolver
para actualizar los datos de la imagen de la carátula del álbum; esto se almacenó en almacenamiento compartido. Habiendo mirado el Android 10+ aosp MediaProvider
código fuente parece que las aplicaciones que solían usar MediaStore
actualizar la carátula del álbum para que apunte a un archivo de datos ya no funciona, simplemente porque el MediaProvider
internamente crea su propia obra de arte en un oculto .thumbnails
carpeta mirando directamente a los mp3 y usando un MediaExtractor
, y nunca hace referencia a la ContentValues
que se insertaron para hacer referencia a la obra de arte. Entonces, aunque puede actualizar la obra de arte usted mismo, consulte el MediaStore
para ello y verlo, otras aplicaciones tienen que usar ContentResolver#loadThumbnail
en api 29+ que no hace referencia a sus valores actualizados y crea una obra de arte con pereza o selecciona el archivo ya generado en el .thumbnails
carpeta. Obviamente, nada de esto está documentado, y recibí una reacción violenta masiva a mi aplicación con críticas negativas, sin embargo, estos cambios estaban rompiendo cambios y completamente fuera de mi control y me llevaron a buscar en el código fuente de AOSP para descubrir que Android había cambiado fundamentalmente el comportamiento.
(Esto no fue una diatriba, sino un ejemplo de cómo estos cambios no ofrecieron una ruta de migración debido al comportamiento fundamental no documentado de AOSP).
Como se indica en https://developer.android.com/preview/privacy/storage, hay algunos cambios con respecto al almacenamiento en Android 11:
- Dispositivos Android 10
requestLegacyExternalStorage
seguirá funcionando independientemente del SDK de destino
- Dispositivos Android 11
- nueva instalación dirigida a SDK 29:
requestLegacyExternalStorage
se respeta el valor - nueva instalación dirigida a SDK 30:
requestLegacyExternalStorage
es siemprefalse
- actualizar de targeting sdk 29 a 30: si
preserveLegacyExternalStorage
se establece entoncesrequestLegacyExternalStorage
estrue
(este es un caso de migración pura y este estado no se conservará si el usuario desinstala/reinstala la aplicación)
- nueva instalación dirigida a SDK 29:
Está prácticamente obligado a implementar el almacenamiento con ámbito en este punto. A menos que esté listo para migrar, siga apuntando a SDK 29, ya que no hay forma de aplicar el almacenamiento heredado en dispositivos con Android 11 con SDK de destino 30.