现在从sd卡读取音乐文件和歌词文件时会出现乱码问题。
1.读音乐文件是通过查询sd卡来实现,方法如下:
try {
// 歌曲名升序排列
String orderBy = MediaStore.Audio.Media.TITLE + " COLLATE LOCALIZED ASC";
mCursor = getContentResolver().query(MUSIC_URL, mCursorCols,
"duration >= 5000", null, orderBy);
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, "onCreate() getContentResolver ERROR.");
}
// ...
// 获取当前播放歌曲名
public String getTitleByPosition(Cursor c, int position) {
c.moveToPosition(position);
int titleColumn = c.getColumnIndex(MediaStore.Audio.Media.TITLE);
return c.getString(titleColumn).trim();
}这是读取的title就有时候应该是出现了乱码,还没有跟踪确认。但最终显示在TextView中出现乱码。2.读歌词文件是用BufferedReader读取一行数据,然后解析
类似于下面这种方法:
/**
119. * 以行为单位读取文件,常用于读面向行的格式化文件
120. *
121. * @param fileName
122. * 文件名
123. */
124. public static void readFileByLines(String fileName) {
125. File file = new File(fileName);
126. BufferedReader reader = null;
127. try {
128. System.out.println("以行为单位读取文件内容,一次读一整行:");
129. reader = new BufferedReader(new FileReader(file));
130. String tempString = null;
131. int line = 1;
132. // 一次读入一行,直到读入null为文件结束
133. while ((tempString = reader.readLine()) != null) {
134. // 显示行号
135. System.out.println("line " + line + ": " + tempString);
136. line++;
137. }
138. reader.close();
139. } catch (IOException e) {
140. e.printStackTrace();
141. } finally {
142. if (reader != null) {
143. try {
144. reader.close();
145. } catch (IOException e1) {
146. }
147. }
148. }
149. }
150. 读取的tempString就是乱码,通过System.getProperty("file.encoding")得到当前系统字符集为UTF-8,用
String str = new String(tempString.getBytes(), "UTF-8");
str还是乱码。这是什么原因呢?是不是要像
System.getProperty("file.encoding") 得到当前系统字符集
content.getBytes(System.getProperty("file.encoding")),"GBK") 通过当前字符集转码
http://hi.baidu.com/sxhyll/blog/item/3f234ab1b1514e5f0823022e.html
这样设置?
1.读音乐文件是通过查询sd卡来实现,方法如下:
try {
// 歌曲名升序排列
String orderBy = MediaStore.Audio.Media.TITLE + " COLLATE LOCALIZED ASC";
mCursor = getContentResolver().query(MUSIC_URL, mCursorCols,
"duration >= 5000", null, orderBy);
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, "onCreate() getContentResolver ERROR.");
}
// ...
// 获取当前播放歌曲名
public String getTitleByPosition(Cursor c, int position) {
c.moveToPosition(position);
int titleColumn = c.getColumnIndex(MediaStore.Audio.Media.TITLE);
return c.getString(titleColumn).trim();
}这是读取的title就有时候应该是出现了乱码,还没有跟踪确认。但最终显示在TextView中出现乱码。2.读歌词文件是用BufferedReader读取一行数据,然后解析
类似于下面这种方法:
/**
119. * 以行为单位读取文件,常用于读面向行的格式化文件
120. *
121. * @param fileName
122. * 文件名
123. */
124. public static void readFileByLines(String fileName) {
125. File file = new File(fileName);
126. BufferedReader reader = null;
127. try {
128. System.out.println("以行为单位读取文件内容,一次读一整行:");
129. reader = new BufferedReader(new FileReader(file));
130. String tempString = null;
131. int line = 1;
132. // 一次读入一行,直到读入null为文件结束
133. while ((tempString = reader.readLine()) != null) {
134. // 显示行号
135. System.out.println("line " + line + ": " + tempString);
136. line++;
137. }
138. reader.close();
139. } catch (IOException e) {
140. e.printStackTrace();
141. } finally {
142. if (reader != null) {
143. try {
144. reader.close();
145. } catch (IOException e1) {
146. }
147. }
148. }
149. }
150. 读取的tempString就是乱码,通过System.getProperty("file.encoding")得到当前系统字符集为UTF-8,用
String str = new String(tempString.getBytes(), "UTF-8");
str还是乱码。这是什么原因呢?是不是要像
System.getProperty("file.encoding") 得到当前系统字符集
content.getBytes(System.getProperty("file.encoding")),"GBK") 通过当前字符集转码
http://hi.baidu.com/sxhyll/blog/item/3f234ab1b1514e5f0823022e.html
这样设置?
解决方案 »
- 有什么好的方法可以实现一对多连接,最好是能用蓝牙实现,如果不行其他的方法有么?急等!!
- 为什么我的ContentResolver在另一个程序中调用会启动原来的应用程序(附源码)
- 如何做基于MMS协议的音乐播放器,请大家给提供个思路。
- Android 系统下创建xml失败??
- 关于SD Card资源编译的问题
- android:layout_marginBottom相对应的代码
- 关于状态栏显示图标利用framework中的类问题。
- smil彩信格式问题
- 新人求助![Android应用开发] [关于Eclipse的一些小问题].
- 请问,安卓系统在开发3D应用和游戏方面用什么引擎做开发?
- android模拟器的linux内核最新版本是多少
- 关于listview的问题
有一些音乐我是在日文机器上拷贝到sd卡的英文音乐,结果在TextView中文件名显示也会乱码。
先弄清楚文件中数据的编码格式,然后转换就行了。
去这看看能不能解决
还不明白,我用BufferedReader读一行的时候该怎么分析编码?
GBK是中文 你不是日文系统么....... 好乱啊
这个有没有影响?
我同样也看不出 你怎么识别解析mp3文件里的title \ artist\等tag信息的。 ID3有v1和v2两个版本,分别把tag信息写在mp3文件的结尾128字节,和开头。 你从哪里读取的title,开头么????
强烈要求描述乱码的样子~~~~
乱码现象,如图。
读取方法如1L,查询的列有:
String[] mCursorCols = new String[] { MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media.ARTIST_ID,
MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.DURATION };
当歌词文件.lrc为unicode格式时,
while(reader.ready()) {
String lineTemp = reader.readLine();
Log.d(TAG, "lineTemp:" + lineTemp); // 输出乱码
String line = new String(lineTemp.getBytes("utf-8")).trim(); // 通过当前字符集转码
Log.d(TAG, "line:" + line); // 输出乱码
网上有的说用iTunes修改下就不会乱码了,有的是用千千静听播放过导致乱码,没搞明白。
还有就是从电脑上下载的歌词默认是ANSI编码的,转换为utf-8也还是乱码怎么解决呢?
我现在只是把ANSI编码的lrc另存为utf-8编码解决的。如果是在手机上下载,下载后的编码是什么格式的呢?
你把ANSI编码的lrc另存为utf-8编码,可以解决肯定没问题。转换为utf-8肯定也是没问题的,但是为什么还是乱码呢?我猜,因为你以为在java里以"utf-8"方式getbytes 就是成功正确的转码了。其实不是的。
ANSI编码是本地化编码,如果当前是中文系统,就默认GB2312编码。如果当前是日文系统,就默认为JIS编码。2字节存储一个文字。即使是英文,也是2字节来存储。(很浪费空间)
Unicode是一种国际化的字符集,各国文字的字符区域都不重复,然而utf-8呢,是Unicode的一种编码方式。 对待英文和中文以及各种文字,都是不同字节数的。
所以 在转换为utf-8的时候搞不清楚哪字节和哪字节是一个文字了,拆分错误,就乱码拉。如果是手机上下载,那歌词肯定也是ANSI,由手机当前的系统语言决定具体到底是什么编码。
Android:utf-8 。结果:乱码。
我刚刚做完在Android下音乐播放器同时解析简体中文,繁体中文,日文,韩文的mp3 tag信息的工作。都是在cpp里操作的,对上层java不是很了解,如果有什么地方说错了,还望你指出。
理论上是这样的,但是实际操作不好实现。Android就非常讨厌,单说mp3信息处理这一块,它默认针对日文采用ANSI中的JIS,繁体中文采用ANSI中的BIG5,韩文采用UNICODE的UCSKR,中文简体采用不是ANSI更不是UNICODE的GBK... 但是我们在程序里基本没有什么好办法来判断这些奇奇怪怪的数字到底表示的是哪国语言,所以只能采取统一的处理方式,所以通常会发现,中文没乱码了,韩文全是乱码等现象。 查表是个方法,但是是个多么多么吓人的方法啊!
GBK和GB2312的简体中文编码是一样的吧?据说兼容阿
是一样的为什么要起两个名字?
GB2312 英文中文都2字节存储
GBK 英文1字节,中文2字节存储
不知道效率上哪个高点,为什么又要有两种编码呢?
肯定GBK省空间呀。 因为GB2312能够收录的汉字太少,我们汉字博大精深哇哈哈哈,就衍生了GBK,又增加收录了几千个汉字。具体几千我也忘记了-。-
嗯啊, 有高手开发好不? 没见到市面上有那款Android手机或者平板电脑不需要自己手动转码(千千静听)就都OK的
这样读取出来 就ok了
我现在使用15楼的方法,就是在windowsxp下运行读文件正常,但是同样的代码在android模拟器下就乱码
乱码信息头如下:
11-08 06:30:36.408: INFO/System.out(523): LrcProcessor--->temp:ID3
我把这个歌词文件的title \ artist\等tag信息都删除了,还是出现乱码问题!
手机上显示出来的是乱码。
数据库db里的对应字段也乱了。看来是扫描卡里数据时写进数据表时就乱了。
LZ 这问题你是怎么解决的?