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

Android 10及以上系统音乐播放列表重命名与删除功能失效问题求助

Android 10+ 播放列表重命名/删除失效解决方案

问题根因

Android 10(API 29)及以上版本对MediaStore操作规则做了变更:禁止对MediaStore根集合URI通过selection条件操作单条记录,必须使用对应单条记录的专属带ID URI,也就是系统要求的AUDIO_PLAYLISTS_ID类型URI,这是原有代码报错的核心原因。
拼接ID后未生效通常是三个常见问题:

  • URI拼接方式不规范
  • 权限配置不符合系统要求
  • Android 11及以上操作非自身创建的播放列表未走用户授权流程

解决方案

1. 权限配置

在AndroidManifest.xml中添加对应权限声明:

<!-- Android 10 及以下需要 -->
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="29" />
<!-- Android 10 临时适配标记,Android 11及以上自动忽略 -->
<application
    android:requestLegacyExternalStorage="true"
    ...>
</application>

如果需要操作其他应用创建的播放列表,Android 11及以上还需要申请MANAGE_MEDIA权限,引导用户在系统设置中开启媒体管理权限。

2. 代码适配

首先统一使用ContentUris.withAppendedId构造带ID的专属URI,不要手动拼接字符串避免格式错误。

修正后的重命名方法

private fun renamePlaylist(resolver: ContentResolver, playlist: Playlist, newName: String) {
    // 构造带ID的专属URI
    val playlistUri = ContentUris.withAppendedId(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, playlist.id)
    val values = ContentValues()
    values.put(MediaStore.Audio.Playlists.NAME, newName)
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        // Android 11及以上,操作非自身创建的播放列表需要申请修改权限
        val urisToModify = listOf(playlistUri)
        val editRequest = MediaStore.createWriteRequest(resolver, urisToModify)
        // 注意:此处需要用当前Activity启动该Intent,等待用户授权后再执行update操作
        // startActivityForResult(editRequest, REQUEST_CODE_RENAME_PLAYLIST)
    } else {
        // Android 10及以下直接执行更新
        resolver.update(playlistUri, values, null, null)
    }
}
// 授权回调后执行更新的示例
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE_RENAME_PLAYLIST && resultCode == Activity.RESULT_OK) {
        // 用户授权通过,再执行resolver.update操作
    }
}

修正后的删除方法

fun deletePlaylist(resolver: ContentResolver, id: Long) {
    val playlistUri = ContentUris.withAppendedId(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, id)
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        // Android 11及以上,操作非自身创建的播放列表需要申请删除权限
        val urisToDelete = listOf(playlistUri)
        val deleteRequest = MediaStore.createDeleteRequest(resolver, urisToDelete)
        // 同样需要启动Intent等待用户授权
        // startActivityForResult(deleteRequest, REQUEST_CODE_DELETE_PLAYLIST)
    } else {
        // Android 10及以下直接执行删除
        resolver.delete(playlistUri, null, null)
    }
}

注意事项

  • 如果你操作的是当前应用自己创建的播放列表,Android 11及以上不需要申请用户授权,直接调用update/delete即可生效
  • 如果操作的是其他应用创建的播放列表,必须走系统提供的申请流程,拿到用户授权后才能操作成功

内容的提问来源于stack exchange,提问作者FF75

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:57:03