Android 11调用MediaStore删除第三方播放列表崩溃问题排查
Android 11下MediaStore删除第三方播放列表崩溃问题
已有若干类似问题被提出,但均无法解决当前问题——此问题仅出现在Android 11中,Android 12和13上运行无异常。
已排除的问题:Stack Overflow上关于java.lang.IllegalArgumentException: All requested items must be referenced by specific ID的相关问题。
我尝试删除非本应用创建的媒体播放列表,针对Android 11及以上版本,采用官方文档中的代码实现:
@Composable fun DeletePlaylistButton( playlistId : Long, onDeleteCompleted: () -> Unit ) { val context = LocalContext.current.applicationContext val launcher = rememberLauncherForActivityResult( contract = ActivityResultContracts.StartIntentSenderForResult(), onResult = { if (it.resultCode == Activity.RESULT_OK) onDeleteCompleted() }) Button(onClick = { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { val pi = MediaStore.createDeleteRequest(context.contentResolver, listOf(ContentUris.withAppendedId(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, playlistId))) val request = IntentSenderRequest.Builder(pi.intentSender).build() launcher.launch(request) } }) { Text("Delete") } }
该代码在Android 12和13上运行正常,会弹出删除确认对话框,但在Android 11上崩溃,报错如下:
java.lang.IllegalArgumentException: All requested items must be referenced by specific ID at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:172) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142) at android.content.ContentProviderProxy.call(ContentProviderNative.java:732) at android.content.ContentResolver.call(ContentResolver.java:2405) at android.provider.MediaStore.createRequest(MediaStore.java:822) at android.provider.MediaStore.createDeleteRequest(MediaStore.java:985)
排查情况
- 使用运行API 29(该版本无
MediaStore.createXXXXXRequest方法)、30、32、33的Pixel 6模拟器测试,仅Android 11设备运行失败。 - 推送至各设备的文件完全一致,已导出模拟器媒体库数据库,确认引用的播放列表ID正确。
- 生成的删除请求Uri为
content://media/external/audio/playlists/734,与数据库中的条目匹配(对应导出的audio_playlists表条目)。
额外信息
Android 10、11、12和13的媒体库数据库位置有所变化:
- Android 10:
/data/data/com.android.providers.media/databases - Android 11:
/data/data/com.android.providers.media.module/databases - Android 12/13:
/data/data/com.google.android.providers.media.module/databases
Android 10到11之间存在包结构调整与文件迁移,怀疑是Android 11源码的bug,但暂未确认。无法使用android.permission.MANAGE_EXTERNAL_STORAGE权限,否则应用无法通过Google Play审核。目前若无解决方案,只能为Android 11用户移除该功能。
补充说明
对其他媒体条目(如audio表)使用类似的content:// Uri发起写入请求,在所有模拟器上均正常,仅播放列表出现问题。
问题追踪
相关问题在Google Issue Tracker上有用户反馈相同情况,但该问题已被关闭。
恳请各位提供帮助!
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

