有哪些问题导致:
1、google mediaScanner 的缺陷
2、qcom MP3 PARSER的问题 (找QCOM)
Google不支持针对每个TAG ITEM 单独处理, 而是假设ID3 中所有的TAG类型都是一种编码格式
摘自百度百科:
ID3 V2 (一般是V2.3)
帧头的定义如下:
char FrameID[4]; /*用四个字符标识一个帧,说明其内容,稍后有常用的标识对照表*/
char Size[4]; /*帧内容的大小,不包括帧头,不得小于1*/
char Flags[2]; /*存放标志,只定义了6位,稍后详细解说*/
1.帧标识
用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下:
TIT2=标题 表示内容为这首歌的标题,下同
TPE1=作者
TALB=专集
TRCK=音轨 格式:N/M 其中N为专集中的第N首,M为专集中共M首,N和M为ASCII码表示的数字
TYER=年代 是用ASCII码表示的数字
TCON=类型 直接用字符串表示
COMM=备注 格式:"eng\0备注内容",其中eng表示备注所使用的自然语言
下面摘自:http://article.yeeyan.org/view/460289/398443
一般来说,一个字符串表示范围在$20-$FF的ISO-8859-1字符。这种字符串在帧描述中表示为,或者如果允许换行则为。所有Unicode字符串使用16位Unicode 2.0((ISO/IEC 10646-1:1993, UCS-2)。Unicode字符串必须以Unicode BOM($FF FF或$FE FF)开头来识别字节顺序。
所有数字字符串和URL必须编码为ISO-8859-1。如果编码为ISO-8859-1则必须以$00作为字符串的结束,如果编码为Unicode则为$00 00。一般来说,换行符是被禁止的。在ISO-8859-1中,如果允许换行则只能用$0A表示换行。
对于允许不同类型文字编码的帧,在其帧大小之后紧跟一个字符编码描述位。如果使用ISO-8859-1则该位应为$00,如果使用Unicode则应为$01。依赖于字符编码的字符串表示为,或者如果允许换行则表示为。
对于NULL结尾的空Unicode字符串,在Unicode DOM之后跟随一个Unicode NULL($FF FE 00 00或$EF FF 00 00)。
三个字节的语言字段用户描述帧内容的语言,其参照ISO-639-2标准。
解决方案:
对每个TAG ITEM 单独测试码表,然后利用 ucnv_convertEx 将源编码格式转换为UTF-8格式
KK 的源码中有MediaScannerClient::convertValues,
这个函数循环处理了 mValues 这个数组。
很简单: 将这个函数改造成针对单个TAG item的函数。
然后改造 endFile, 针对单个ITAM处理即可。