Android 13权限变更后,如何修改媒体文件元数据?
API 33 下无法使用 TagLib 修改音乐文件元数据的解决方案
问题背景
升级到 Android API 33 后,原有用 TagLib 修改音乐文件元数据的代码因权限问题失效。已在清单中添加以下读取权限:
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
但这些仅为读取权限,目前找不到适配的外部存储写入权限,导致核心功能(修改音乐元数据)无法正常运行。
可行解决方案
通过 MediaStore API 修改元数据
API 33 及更高版本,官方推荐用 MediaStore 而非直接操作文件路径来修改媒体元数据。你可以通过 ContentResolver 更新音乐的指定字段,示例代码:val contentValues = ContentValues().apply { put(MediaStore.Audio.Media.TITLE, "新标题") put(MediaStore.Audio.Media.ARTIST, "新艺术家") // 按需添加专辑、流派等其他元数据字段 } val uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI val selection = "${MediaStore.Audio.Media._ID} = ?" val selectionArgs = arrayOf(targetSongId.toString()) contentResolver.update(uri, contentValues, selection, selectionArgs)这种方式无需额外写入权限,只要能获取到目标音乐的 ID 和对应 URI 即可操作。
将音乐文件存储到应用专属目录
如果音乐文件是应用自身下载或生成的,可将文件保存在应用专属外部存储目录(getExternalFilesDir(Environment.DIRECTORY_MUSIC)),此目录下的文件读写无需任何权限,可直接用 TagLib 修改元数据。申请 MANAGE_EXTERNAL_STORAGE 权限(仅限必要场景)
若必须修改任意外部存储的音乐文件,可申请全存储访问权限,但该权限需用户手动在系统设置中开启,且谷歌审核严格,仅适用于文件管理器类刚需应用。
清单中添加权限:<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" />代码中引导用户开启权限:
if (!Environment.isExternalStorageManager()) { val intent = Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION) startActivity(intent) }
内容的提问来源于stack exchange,提问作者Victoria Firewind
相关产品推荐
相关产品推荐

