获取MP3音乐数据两种方式

    |     2016年2月18日   |   Android UI界面   |     0 条评论   |    4550

大多数年轻人都喜欢用手机听音乐,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());

mediastore1

转载请注明来源:获取MP3音乐数据两种方式
回复 取消