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

原创 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()函数

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

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

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

Android 利用presentation实现双屏异显

我的思路是在主屏中开启activity,然后在副屏中开启服务,通过服务我们就可以让副屏一直显示或者播放节目或者打开其他应用,哪怕是退主屏退出activity。 // 获取显示设备。 pu...

基于Android5.1的双屏异显分析

平台:android5.1 场景:客户的设备需要使用到双屏异显。分析双屏异显时,framework所做的准备。 时间:2016.9.28Android从4.2开始支持双屏异显,其Java使用示例...

Input系统学习笔记

平台:android2.2 场景:全键盘电子书项目需要为系统新增需要按键,同时对于一些touch事件需要做特殊的处理,所以需要对整个input进行一些了解。 时间:2011.12~2012.31....

Vold学习笔记

本文主要参考学习了老邓的Vold章节。平台:android4.0 场景:客户要求系统默认对NTFS的SD卡支持识别。 时间:2012.7.28Android系统默认支持FAT文件系统,不支持NTF...

Android双屏异显的实现

概述 Android实现双屏异显的实现方式有2种。 方式一:在Android4.2及以上平台上,按照标准Android SDK提供的API,使用Presentation类,将一个APP的相关内容显示到...

双camera同时打开

平台:android5.1 场景:客户的设备需要使用到双屏异显。分析双屏异显时,framework所做的准备。 时间:2016.9.28Android从4.2开始支持双屏异显,其Java使用示例...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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