Verificamos profundamente cada uno de los escritos de nuestra web con la meta de enseñarte siempre la información más veraz y actual.
Solución:
Hay dos formas de hacer esto en Android 10, que depende del valor de android:requestLegacyExternalStorage
en la aplicación AndroidManifest.xml
Archivo.
Opción 1: Almacenamiento con ámbito habilitado (android:requestLegacyExternalStorage="false"
)
Si su aplicación adicional el contenido para empezar (usando contentResolver.insert
) luego el método anterior (usando contentResolver.delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, whereClause, idsArray)
) Deberia trabajar. En Android 10, cualquier contenido enviado a Media Store por una aplicación puede ser manipulado libremente por esa aplicación.
Para el contenido que agregó el usuario, o que pertenece a otra aplicación, el proceso es un poco más complicado.
Borrar un solo artículo de Media Store, no pase el URI genérico de Media Store a delete
(es decir: MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
), sino que utilice el URI específico del elemento.
context.contentResolver.delete(
audioContentUri,
"$MediaStore.Audio.Media._ID = ?",
arrayOf(audioContentId)
(Estoy bastante seguro de que la cláusula ‘dónde’ no es necesaria, pero tenía sentido para mí 🙂
En Android 10, esto probablemente arrojará un RecoverableSecurityException
, si tu targetSdkVersion
es> = 29. Dentro de esta excepción hay un IntentSender
que puede ser iniciado por su Activity
para solicitar permiso al usuario para modificarlo o eliminarlo. (El remitente se encuentra en recoverableSecurityException.userAction.actionIntent.intentSender
)
Debido a que el usuario debe otorgar permiso a cada elemento, no es posible eliminarlos de forma masiva. (O probablemente sea posible solicitar permiso para modificar o eliminar todo el álbum, una canción a la vez, y luego usar el delete
consulta que utiliza arriba. En ese momento, su aplicación tendría permiso para eliminarlos, y Media Store lo haría todo a la vez. Pero primero debes preguntar por cada canción).
Opcion 2: Almacenamiento heredado habilitado (android:requestLegacyExternalStorage="true"
)
En este caso, simplemente llamando contentResolver.delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, whereClause, idsArray)
no solo elimina los elementos de la base de datos, sino que también elimina los archivos.
La aplicación debe mantenerse WRITE_EXTERNAL_STORAGE
permiso para que esto funcione, pero probé el código que tiene en la pregunta y verifiqué que los archivos también se eliminaron.
Entonces, para versiones anteriores de API, creo que debe usar contentResolver.delete
y desvincular el archivo usted mismo (o desvincular el archivo y enviar una solicitud para que se vuelva a escanear a través de MediaScannerConnection
).
Para Android 10+, contentResolver.delete
eliminará tanto el índice como el contenido en sí.
En Android 11 la eliminación / actualización de múltiples archivos multimedia es compatible con las apis mejores y más limpias.
Antes de Android 10, tenemos que eliminar la copia física del archivo formando el objeto Archivo y también eliminar el archivo indexado en MediaStore usando ContentResolver.delete () (o) hacer un escaneo de medios en el archivo eliminado que eliminaría su entrada en MediaStore.
Así es como solía funcionar en sistemas operativos inferiores a Android 10. Y también funcionaría igual en Android 10 si hubiera optado por no utilizar el almacenamiento de ámbito especificándolo en el manifiesto de Android: requestLegacyExternalStorage = “true”
Ahora en Android 11 está obligado a utilizar el almacenamiento con ámbito. Si desea eliminar cualquier archivo multimedia que no haya creado usted, debe obtener el permiso del usuario. Puede obtener el permiso mediante MediaStore.createDeleteRequest (). Esto mostrará un cuadro de diálogo que describe qué operación están a punto de realizar los usuarios, una vez que se otorga el permiso, Android tiene un código interno para encargarse de eliminar tanto el archivo físico como la entrada en MediaStore.
private void requestDeletePermission(List uriList)
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R)
PendingIntent pi = MediaStore.createDeleteRequest(mActivity.getContentResolver(), uriList);
try
startIntentSenderForResult(pi.getIntentSender(), REQUEST_PERM_DELETE, null, 0, 0,
0);
catch (SendIntentException e)
El código anterior haría ambas cosas, solicitar el permiso para eliminar y, una vez otorgado el permiso, eliminar los archivos también.
Y el resultado lo obtendría en onActivityResult ()
valoraciones y reseñas
Si entiendes que ha sido de utilidad nuestro post, nos gustaría que lo compartas con el resto entusiastas de la programación de esta forma contrubuyes a dar difusión a este contenido.