媒体库扫描某些文件出现乱码的问题

原创 2015年07月09日 17:15:15

平台:android4.0
场景:客户反馈部分中文歌曲的ID3信息显示为乱码。
时间:2012.6

参考网址:http://bbs.chinaunix.net/thread-3777433-2-1.html

将android系统语言设置为英文后,把一首包含中文的ID3信息的歌曲拷贝到机器中,可能在播放此歌曲时看到ID3信息是乱码。
当以下两个条件同时出现时,在android系统上将必定出现此问题:
1.当前语言设置为英文或其他(非中文)。
2.拷贝进去的歌曲的ID3信息是通过GBK编码写入的。

原因分析:
系统通过MediaScanner扫描的时候,将先在MediaProvider中构建一个MediaScanner的对象,在这个过程中,将调用

MediaScanner scanner = new MediaScanner(this);
Locale locale = getResources().getConfiguration().locale;
if (locale != null) {
String language = locale.getLanguage();
String country = locale.getCountry();
String localeString = null;
if (language != null) {
if (country != null) {
scanner.setLocale(language + "_" + country);
} else {
scanner.setLocale(language);
}
}
}

即在扫描之前,将调用scanner的setLocale()函数。
此函数为native函数,其最终将设置native的client对象中保存的mLocaleEncoding变量的值。而在媒体库扫描中,主要支持了以下几种编码格式:
(1).kEncodingNone—0000,默认的格式(Unicode编码,应该是使用的UTF-8)
(2).kEncodingShiftJIS—0001,日文编码格式
(3).kEncodingGBK—0010,中文简体编码格式
(4).kEncodingBig5—0100,中文繁体编码格式
(5).kEncodingEUCKR—1000,韩文编码格式
而其中另一个经常使用的变量kEncodingAll为1111。
MediaScannerClient.cpp中的setLocale()的实现,就是根据java层设置的参数来进行编码格式的设定。

在非中文的语言设置下,必然是不会使用GBK编码(mLocaleEncoding默认值为kEncodingNone)。若歌曲的ID3信息是以GBK进行保存的,因此就出现了乱码!
请注意:我们在扫描并保存歌曲等信息的时候,将先调用到native的client对象的addStringTag()方法,若编码格式没有问题,则将在此函数中直接调用handleStringTag()进行了信息的添加保存。
但若编码格式存在问题,则函数将获取的信息保存到mNames的mValues中,然后在调用client.endFile()时,统一对信息的编码进行处理,尝试转换成合理的编码后再进行handleStringTag()的调用保存。

在addStringTag()和endFile()函数中,第一句都是这个判断:

if (mLocaleEncoding != kEncodingNone)

由此可见,mLocaleEncoding的重要性。
确切的说,是mLocaleEncoding在初始化以及被setLocale()设置两个方面的重要性!
问题出现,正是因为mLocaleEncoding初始化的值就是kEncodingNone,然后又是在英文环境下,setLocale()后的mLocaleEncoding的值依然是kEncodingNone,所以addStringTag()中就直接进行了GBK信息的UTF-8的保存。endFile()函数中不再有任何表示。

解决方法:
1.我们需要在非对应的环境下(例如,英文环境–中文编码),确保不能在addStringTag()中就直接添加。
—-可以改变mLocaleEncoding的初始值。

2.在endFile()中对信息编码进行转换的时候,尽量确保每一种语言能使用其对应的编码方式进行保存。
—-possibleEncodings()(比如说,中文环境下—GBK编码,以UTF-8保存的ID3信息是不会出现乱码的!这正是因为此函数的功劳,它将尽可能获取保存信息的编码格式,确认UTF-8不会被转换成GBK)
—-convertValues()函数

MediaScanner源码分析

转自:http://blog.csdn.net/jgdu1981/article/details/6771031

android MediaScanner 扫出来的ID3 MP3文件演唱者信息 乱码

0、首先得理解MP3格式文件的结构 简单的就是 MP3 文件大体分为三部分:TAG_V2(ID3V2),音频数据,TAG_V1(ID3V1) 参考此博客:点击打开链接 ID3V1的结构是: ...

Android自带播放器字符串显示乱码问题的一个解决方法

在开发中遇到这个问题,在网上搜了很多人的方法,没找到通过修改源代码解决乱码问题的比较具体的文章。研究了2天,找到了一个修改方法,可能不十分完善,但经过测试暂时还没再遇到乱码问题,所以分享一下。 ...

Android自带播放器字符串显示乱码问题的一个解决方法

在开发中遇到这个问题,在网上搜了很多人的方法,没找到通过修改源代码解决乱码问题的比较具体的文章。研究了2天,找到了一个修改方法,可能不十分完善,但经过测试暂时还没再遇到乱码问题,所以分享一下。 ...

Android开发之媒体扫描详细解析(上)

之前在看视频的时候一直不明白为什么可以直接从手机中扫描出视频和音乐,今天看了这篇博文才觉悟,感谢写这篇文章的博主!...

Android保存图片到图库,Android扫描文件到媒体库,Android保存图片到SD卡

我们最常常遇到的也就是保存图片到SD卡,然后打开系统的图库可以看得到,可是为什么微信QQ之类的应用可以,我们保存到SD卡就看不到呢?原因就是保存到SD卡后我们还要让系统扫描图片到多媒体库,因为系统的图...

Android保存图片到图库,Android扫描文件到媒体库,Android保存图片到SD卡

我们最常常遇到的也就是保存图片到SD卡,然后打开系统的图库可以看得到,可是为什么微信QQ之类的应用可以,我们保存到SD卡就看不到呢?原因就是保存到SD卡后我们还要让系统扫描图片到多媒体库,因为系统的图...

Android保存图片到图库,Android扫描文件到媒体库,Android保存图片到SD卡

我们最常常遇到的也就是保存图片到SD卡,然后打开系统的图库可以看得到,可是为什么微信QQ之类的应用可以,我们保存到SD卡就看不到呢?原因就是保存到SD卡后我们还要让系统扫描图片到多媒体库,因为系统的图...

安卓进阶之扫描系统媒体库

最近自己做一个视频播放器,查找了一些内容提供者操作多媒体数据的资料,在这里记录下来通过调用Android的API,可以实现相册,播放器,录音和摄像等功能。这一章需要掌握如下功能:q 多媒体的...

Android添加新的视频格式--媒体库扫描

需求:在mediaprovider数据库中添加.mov后缀格式的视频文件 可以使用工具MediaInfo_GUI_0.7.67_Windows.3243836749.exe 查看mov文件编码格式类型...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:媒体库扫描某些文件出现乱码的问题
举报原因:
原因补充:

(最多只允许输入30个字)