Android自带播放器字符串显示乱码问题的一个解决方法
来源:互联网 发布:linux 在线安装ant 编辑:程序博客网 时间:2024/05/22 17:19
在开发中遇到这个问题,在网上搜了很多人的方法,没找到通过修改源代码解决乱码问题的比较具体的文章。研究了2天,找到了一个修改方法,可能不十分完善,但经过测试暂时还没再遇到乱码问题,所以分享一下。
改动步骤如下:
(Android版本:2.3, 文件路径:/frameworks/base/media/libmedia/MediaScannerClient.cpp)
1.MediaScannerClient类构造函数中本地编码初始值设为:kEncodingGBK
mLocaleEncoding(kEncodingGBK)
2.MediaScannerClient::endFile()函数中
加入下面的代码:
// add {
// if the possible encoding is judged as an only one, use it instead of default(GBK).
if(encoding == kEncodingShiftJIS || encoding == kEncodingGBK
|| encoding == kEncodingBig5 || encoding == kEncodingEUCKR) {
convertValues(encoding);
} else
// add end }
// if the locale encoding matches, then assume we have a native encoding.
if (encoding & mLocaleEncoding)
convertValues(mLocaleEncoding);
后面可以继续加入自己需要的逻辑,如把GBK的优先级设为高于ShiftJIS:
else if ((encoding & kEncodingGBK) > 0 && (encoding & kEncodingShiftJIS) > 0)
convertValues(kEncodingGBK);
这样就OK了。下面大概解释一下:
(路径:\frameworks\base\media\libstagefright\StagefrightMediaScanner.cpp)
StagefrightMediaScanner::processFile()是对扫描到的文件中的多媒体文件里的字串数据进行转换处理的过程:
1. client.setLocale(locale());
这个函数会根据手机设置的语言来设置mLocaleEncoding的值,mLocaleEncoding默认值是kEncodingNone,如果语言用户设置了英文,那么中文字串就会因为这个函数导致mLocaleEncoding的值没有变成kEncodingGBK,进而产生乱码。
2.从for循环中的client.addStringTag(kKeyMap.tag, value); 可以看到,只有mLocaleEncoding != kEncodingNone才会去对文件中读到的字串进行判断,然后如果不是ascii码才会压进client.beginFile();中创建的名值对(名:如"Aritist",值:如"李宗盛")的栈,否则直接调用handleStringTag()扔给Client,结束处理。这就是需要进行改动1的原因。
3.client.endFile();首先对栈里的所有的“值”字串的值进行区间判断,得到这些字串的可能编码,并取“与”,就是不断缩小可能编码范围:
encoding &= possibleEncodings(mValues->getEntry(i));
然后判断如果得到的可能编码范围中有mLocaleEncoding的,就以mLocaleEncoding为栈中所有“值”字串的编码进行转换:
if (encoding & mLocaleEncoding)
convertValues(mLocaleEncoding);
这对于有中文的字串没有问题,但如果是日文歌曲并且文件里面的字串是纯日文编码(ShiftJIS)的,那还是乱码,因为没有执行convertValues()进行转换。所以加入了改动2,也就是如果分析得到的可能编码只有一种,则选择这种编码。
对于其它的可能情况,比如字串的可能编码判断出不只一种,而且其中没有mLocaleEncoding的,没有进一步处理,所以逻辑上还是有一定漏洞的,大家可以自己根据需要修改。
转载请注明出处,谢谢!
Android自带播放器字符串显示乱码问题的一个解决方法[原创]
http://www.eoeandroid.com/thread-95847-1-1.html
改动步骤如下:
(Android版本:2.3, 文件路径:/frameworks/base/media/libmedia/MediaScannerClient.cpp)
1.MediaScannerClient类构造函数中本地编码初始值设为:kEncodingGBK
mLocaleEncoding(kEncodingGBK)
2.MediaScannerClient::endFile()函数中
加入下面的代码:
// add {
// if the possible encoding is judged as an only one, use it instead of default(GBK).
if(encoding == kEncodingShiftJIS || encoding == kEncodingGBK
|| encoding == kEncodingBig5 || encoding == kEncodingEUCKR) {
convertValues(encoding);
} else
// add end }
// if the locale encoding matches, then assume we have a native encoding.
if (encoding & mLocaleEncoding)
convertValues(mLocaleEncoding);
后面可以继续加入自己需要的逻辑,如把GBK的优先级设为高于ShiftJIS:
else if ((encoding & kEncodingGBK) > 0 && (encoding & kEncodingShiftJIS) > 0)
convertValues(kEncodingGBK);
这样就OK了。下面大概解释一下:
(路径:\frameworks\base\media\libstagefright\StagefrightMediaScanner.cpp)
StagefrightMediaScanner::processFile()是对扫描到的文件中的多媒体文件里的字串数据进行转换处理的过程:
1. client.setLocale(locale());
这个函数会根据手机设置的语言来设置mLocaleEncoding的值,mLocaleEncoding默认值是kEncodingNone,如果语言用户设置了英文,那么中文字串就会因为这个函数导致mLocaleEncoding的值没有变成kEncodingGBK,进而产生乱码。
2.从for循环中的client.addStringTag(kKeyMap.tag, value); 可以看到,只有mLocaleEncoding != kEncodingNone才会去对文件中读到的字串进行判断,然后如果不是ascii码才会压进client.beginFile();中创建的名值对(名:如"Aritist",值:如"李宗盛")的栈,否则直接调用handleStringTag()扔给Client,结束处理。这就是需要进行改动1的原因。
3.client.endFile();首先对栈里的所有的“值”字串的值进行区间判断,得到这些字串的可能编码,并取“与”,就是不断缩小可能编码范围:
encoding &= possibleEncodings(mValues->getEntry(i));
然后判断如果得到的可能编码范围中有mLocaleEncoding的,就以mLocaleEncoding为栈中所有“值”字串的编码进行转换:
if (encoding & mLocaleEncoding)
convertValues(mLocaleEncoding);
这对于有中文的字串没有问题,但如果是日文歌曲并且文件里面的字串是纯日文编码(ShiftJIS)的,那还是乱码,因为没有执行convertValues()进行转换。所以加入了改动2,也就是如果分析得到的可能编码只有一种,则选择这种编码。
对于其它的可能情况,比如字串的可能编码判断出不只一种,而且其中没有mLocaleEncoding的,没有进一步处理,所以逻辑上还是有一定漏洞的,大家可以自己根据需要修改。
转载请注明出处,谢谢!
Android自带播放器字符串显示乱码问题的一个解决方法[原创]
http://www.eoeandroid.com/thread-95847-1-1.html
- Android自带播放器字符串显示乱码问题的一个解决方法
- Ubuntu自带播放器歌曲乱码问题--解决
- android自带播放器的例子
- 调用Android自带的播放器播放Audio
- android自带音乐播放器删除音乐失败的问题
- Android启动自带播放器
- Android多媒体学习五:调用Android自带的播放器播放Audio
- Android多媒体学习:调用android自带的播放器播放Audio
- Android多媒体学习四:调用Android自带的播放器播放Audio
- Android多媒体学习五:调用Android自带的播放器播放Audio
- 手机自带音乐播放器不能更新列表的解决方法
- fedora自带的Rhythmbox播放器
- 调用iPhone自带的播放器
- 使用android模拟器自带的音乐播放器播放音乐
- Android自带Music播放器更新播放时间和进度条的方法
- 解决android 显示中文字符串乱码的问题
- 国外空间乱码显示问题的解决方法
- android音乐播放器-------使用android系统自带的数据库
- 标签因结构而生
- 开发板+GSM模块彩信发送实现
- C#匿名类型
- 对ListView新的理解
- 程序员不成熟的若干个特征
- Android自带播放器字符串显示乱码问题的一个解决方法
- IOS开发之——Core Data学习
- java 加载properties 文件
- packrec
- 创建存储过程的要点
- 制作Fastbook:一段HTML5爱情故事
- Activity生命周期
- 深入理解Android gtest 测试框架
- 学习笔记之vi之分页功能