获取MP3音乐数据两种方式
大多数年轻人都喜欢用手机听音乐,APP应用市场提供了各种各样的音乐播放器,这里我们来实现一款自己的音乐播放器,首先获取本地音乐数据.
本地音乐数据保存在手机存储中,我们可以采用遍历手机文件的方式过虑获取音乐资源。
代码如下:
/** * 扫描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); } } } } }
程序中调用此方法得到Mp3音乐添加到ArrayList集合mMusicList中,文件等耗时操作应放到线程中进行.
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();
MP3音乐文件中不仅包含有歌曲数据,还有其它信息如:歌曲的名字,歌曲的专辑名,歌手名,歌曲文件的路径,歌曲的总播放时长等信息.要得到这些信息采用上述递归方式需要按照一定格式才能读取。
然而Android手机系统已经为我们读取了这些信息保存在系统媒体库表里,当启动手机,拔插SDcard时系统会发送扫描广播,扫描服务接收广播对指定文件进行扫描,添加数据到媒体库表。媒体库URI地址为:MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,这样我们可以通过查询媒体库获取音乐数据。
查询指定dirName路径媒体数据:
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);
查询所有媒体数据:
Cursor cursor = getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
查出的媒体数据不仅是音乐mp3还有其它,需要过虑下:
/** * 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); }
isRepeat()方法是去掉重复资源,getAlbumImage()可根据album_id读取音乐图片地址
/** * 根据音乐名称和艺术家来判断是否重复包含了 * * @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; }
读取音乐数据显示效果
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());
转载请注明来源:获取MP3音乐数据两种方式