获取MP3音乐数据两种方式
大多数年轻人都喜欢用手机听音乐,APP应用市场提供了各种各样的音乐播放器,这里我们来实现一款自己的音乐播放器,首先获取本地音乐数据.
本地音乐数据保存在手机存储中,我们可以采用遍历手机文件的方式过虑获取音乐资源。
代码如下:
[java]
/**
* 扫描Sdcard(外部存储)下所有文件
*/
public void scanFileList(File parentFile) {
File[] listFile = parentFile.listFiles();
if (listFile != null) {
for (int i = 0; i < listFile.length; i++) {
File file = listFile[i];
if (file.isDirectory()) {
scanFileList(file);
} else {
if (file.getName().endsWith("mp3")) {
MusicBean music = new MusicBean();
String fileName = file.getName();
music.setMusicName(fileName.substring(0, fileName.length()-".mp3".length()));
music.setMusicPath(file.getAbsolutePath());
mMusicList.add(music);
}
}
}
}
}
[/java]
程序中调用此方法得到Mp3音乐添加到ArrayList集合mMusicList中,文件等耗时操作应放到线程中进行.
[java]
new Thread(new Runnable() {
@Override
public void run() {
scanFileList(Environment.getExternalStorageDirectory());
/** ListView刷新必须在UI线程中 通过Handler消息机制发送刷新代码到UI主线程执行 */
mHandler.post(new Runnable() {
@Override
public void run() {
mAdapter.setListData(mMusicList);
}
});
}
}).start();
[/java]
MP3音乐文件中不仅包含有歌曲数据,还有其它信息如:歌曲的名字,歌曲的专辑名,歌手名,歌曲文件的路径,歌曲的总播放时长等信息.要得到这些信息采用上述递归方式需要按照一定格式才能读取。
然而Android手机系统已经为我们读取了这些信息保存在系统媒体库表里,当启动手机,拔插SDcard时系统会发送扫描广播,扫描服务接收广播对指定文件进行扫描,添加数据到媒体库表。媒体库URI地址为:MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,这样我们可以通过查询媒体库获取音乐数据。
查询指定dirName路径媒体数据:
[java]
Cursor cursor = getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,
MediaStore.Audio.Media.DATA + " like ?",
new String[]{dirName + "%"},
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
[/java]
查询所有媒体数据:
[java]
Cursor cursor = getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
[/java]
查出的媒体数据不仅是音乐mp3还有其它,需要过虑下:
[java]
/**
* MediaStore.Audio.Media.EXTERNAL_CONTENT_URI 对应字段
* 歌曲ID:MediaStore.Audio.Media._ID
* 歌曲的名称:MediaStore.Audio.Media.TITLE
* 歌曲的专辑名:MediaStore.Audio.Media.ALBUM
* 歌曲的歌手名:MediaStore.Audio.Media.ARTIST
* 歌曲文件的路径:MediaStore.Audio.Media.DATA
* 歌曲的总播放时长:MediaStore.Audio.Media.DURATION
* 歌曲文件的大小:MediaStore.Audio.Media.SIZE
*
*/
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
// 如果不是音乐
String isMusic = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.IS_MUSIC));
if (isMusic != null && isMusic.equals("")) continue;
String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
if (isRepeat(title, artist)) continue;
music = new Music();
music.setId(cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID)));
music.setTitle(title);
music.setArtist(artist);
music.setUri(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)));
music.setLength(cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION)));
music.setImage(getAlbumImage(cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID))));
Constances.mMediaLists.add(music);
}
[/java]
isRepeat()方法是去掉重复资源,getAlbumImage()可根据album_id读取音乐图片地址
[java]
/**
* 根据音乐名称和艺术家来判断是否重复包含了
*
* @param title
* @param artist
* @return
*/
private boolean isRepeat(String title, String artist) {
for (Music music : Constances.mMediaLists) {
if (title.equals(music.getTitle()) && artist.equals(music.getArtist())) {
return true;
}
}
return false;
}
/**
* 根据歌曲id获取图片
*
* @param albumId
* @return
*/
private String getAlbumImage(int albumId) {
String result = "";
Cursor cursor = null;
try {
cursor = getContentResolver().query(
Uri.parse("content://media/external/audio/albums/"
+ albumId), new String[]{"album_art"}, null,
null, null);
for (cursor.moveToFirst(); !cursor.isAfterLast(); ) {
result = cursor.getString(0);
break;
}
} catch (Exception e) {
} finally {
if (null != cursor) {
cursor.close();
}
}
return null == result ? null : result;
}
[/java]
读取音乐数据显示效果
[java]
Music music = (Music) getItem(position);
Bitmap icon = BitmapFactory.decodeFile(music.getImage());
holder.icon.setImageBitmap(icon == null ? BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher) : icon);
holder.title.setText(music.getTitle());
holder.artist.setText(music.getArtist());
[/java]
转载请注明来源:获取MP3音乐数据两种方式




























