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
相关产品推荐
相关产品推荐

