1:当前语言为英文时,歌曲信息显示乱码
2:中文状态下,歌曲信息显示乱码
第一种情况出现的原因是因为在英文模式下,MediaScannerClient::setLocale函数没有对“en”设置相应的编码格式,所以中文会出现乱码。
修改方法如下:
else if(!strncmp(locale,"en",2)) mLocaleEncoding = kEncodingGBK;
第二种情况比较复杂,我们分析源码:
for(int i = 0; i < mNames->size(); i++)
encoding& = possibleEncodings(mValues->getEntry(i));
上面的代码是先对所有的Tag进行编码检测,然后进行&操作。
if(encoding & mLocaleEncoding)
convertValues(mLocaleEncoding);
然后检测是否存在有与当前编码方式匹配的,如果有则进行转换,到这里我们是否可以假设一种情况:
如果某个Tag不需要进行转换,另外一个Tag中含有当前的编码方式,于是所有的tag都将通过convertValues函数进行转换,然后乱码现象出现了。这个问题是常见的,我们会发现有些歌曲它的名字是正常的,但是艺术家信息却是乱码,这就是造成这种现象的原因。
于是我们有了以下的处理方法:对单个Tag进行检测转换。
for(int i = 0; i < mNames->size(); i++) {
encoding& = possibleEncodings(mValues->getEntry(i));
if(encoding & mLocaleEncoding)
convertValues(mLocaleEncoding,i);
}
我们只需要对需要转换的Tag进行处理,不需要的就不处理。
以上只是我的个人想法,有不对的地方还请指出来,大家有好的方法也可以交流下。