Saltar al contenido

requestLegacyExternalStorage no funciona en Android 11 – API 30

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 siempre false
    • actualizar de targeting sdk 29 a 30: si preserveLegacyExternalStorage se establece entonces requestLegacyExternalStorage es true (este es un caso de migración pura y este estado no se conservará si el usuario desinstala/reinstala la aplicación)

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *