Android中MP3文件元数据解码乱码问题求助
解决Android MediaMetadataRetriever读取MP3元数据的编码乱码问题
你遇到的是典型的ID3元数据字符编码不匹配问题——捷克语的“ř”显示成“Ĺ™”,本质是UTF-8编码的字节被错误地用ISO-8859-1(或Windows-1252)解码了。下面给你几个可行的解决方案:
方案1:手动修复编码(原生API)
MediaMetadataRetriever在处理某些ID3v2标签时,可能会错误地用单字节编码解析UTF-8内容。我们可以把错误解码的字符串还原成原始字节,再用正确的UTF-8重新解码:
import android.media.MediaMetadataRetriever val mmr = MediaMetadataRetriever() mmr.setDataSource("你的MP3文件路径/Uri") // 务必先设置数据源,你之前的代码遗漏了这一步! var chapterName = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) // 尝试修复UTF-8编码问题 chapterName = chapterName?.let { wrongStr -> try { // 把错误字符串转成ISO-8859-1字节(还原原始UTF-8字节),再用UTF-8解码 String(wrongStr.toByteArray(Charsets.ISO_8859_1), Charsets.UTF_8) } catch (e: Exception) { // 解码失败则保留原字符串 wrongStr } } // 现在chapterName应该显示正确的"Předmluva"了
如果上述方法无效,可能标签用的是UTF-16编码,可以替换成以下解码方式试试:
String(wrongStr.toByteArray(Charsets.ISO_8859_1), Charsets.UTF_16)
方案2:使用第三方库(更可靠)
原生MediaMetadataRetriever对ID3标签的编码支持不够完善,尤其是复杂语言或旧版本标签。推荐使用JAudiotagger(Android适配版),它能自动识别正确的编码:
1. 添加依赖
在你的build.gradle(Module级别)中添加:
implementation 'com.github.kabouzeid:android-audiotagger:2.2.6'
2. 读取元数据
import org.jaudiotagger.audio.AudioFileIO import java.io.File val mp3File = File("你的MP3文件路径") val audioFile = AudioFileIO.read(mp3File) val chapterName = audioFile.tag.title ?: "" // 直接获取正确编码的标题
这个库会自动处理ID3v1、ID3v2的各种编码(UTF-8、UTF-16、ISO-8859-1等),几乎不会出现编码乱码问题。
补充说明
- 一定要确保调用
mmr.setDataSource(),否则extractMetadata会返回null,你之前的代码里缺失了这一步,记得补上。 - 部分MP3可能同时包含ID3v1和ID3v2标签,原生API可能优先读取ID3v1(默认ISO-8859-1),而正确的多语言标题通常存放在ID3v2中,第三方库会优先读取ID3v2标签。
内容的提问来源于stack exchange,提问作者Petr Kott
相关产品推荐
相关产品推荐

