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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:42:42