You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:15:19