通过内容提供者获取手机上的音乐资源

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wxw20147854/article/details/76359942
当我们要获取手机上的某一种资源的时候,如果直接遍历手机上的文件,这样既浪费大量时间也会占用手机大量的资源,这是一种得不偿失的做法。这篇文章在我吸取了大牛们的经验和实践来的。

今天跟大家讲讲如何通过内容提供者获取手机中的音乐资源。
一般我们需要用到的关于音乐的信息有:歌名、专辑、歌手、歌曲时间、文件大小、歌曲路径。为了更好的进行操作,我创建了一个实体类:代码如下:
 
  
/**
 * 音乐的实体类
 * 
 */
public class Music {

    // id
    private long id;
    // 歌名
    private String title;
    // 专辑
    private String album;
    // 歌手
    private String artist;
    // 时长
    private long duration;
    // 文件大小
    private long size;
    // 路径
    private String path;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAlbum() {
        return album;
    }

    public void setAlbum(String album) {
        this.album = album;
    }

    public String getArtist() {
        return artist;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }

    public long getDuration() {
        return duration;
    }

    public void setDuration(long duration) {
        this.duration = duration;
    }

    public long getSize() {
        return size;
    }

    public void setSize(long size) {
        this.size = size;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    @Override
    public String toString() {
        String minute = new BigDecimal(Double.valueOf(duration)/60000).setScale(0, BigDecimal.ROUND_DOWN) + "";
        String second = Math.round(Double.valueOf(duration)%60000 / 1000) + "";
        return "id=" + id
                + "\ntitle------" + title
                + "\nalbum------" + album
                + "\nartist------" + artist
                + "\nduration------" + minute + ":" + second
                + "\nsize------" + new BigDecimal(Double.valueOf(size)/1024/1024).setScale(2, BigDecimal.ROUND_HALF_UP)
                + "\npath------" + path;
    }
}

在Activitiy中创建了一个方法,内容即是通过内容提供者获取音乐资源:
/**
 * 从内容提供者获取歌曲信息
 * @return
 */
private List<Music> getMusicInfo(){
    //TODO 创建一个集合存储读取的歌曲信息
    List<Music> musicList = new ArrayList<>();
    //TODO 读取数据库中歌曲信息
    Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
    for(int i=0; i<cursor.getCount(); i++){
        Music music = new Music();
        cursor.moveToNext();
        // id
        music.setId(cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID)));
        // 歌曲
        music.setTitle(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)));
        // 歌手
        music.setArtist(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)));
        // 时长
        music.setDuration(cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)));
        // 文件大小
        music.setSize(cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE)));
        // 路径
        music.setPath(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)));

        // 将资源为音乐的媒体文件存储到集合中
        if(cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC)) != 0){
            musicList.add(music);
        }
    }

    cursor.close();

    return musicList;
}
该方法返回的外置存储卡中的音乐信息。如果要获取手机内存上的音乐资源,使用:
Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
即可。
示例结果如下:
07-29 13:42:53.883 18468-18468/com.wxw.mengyuan.musictest_1 E/musicInfo: id=192
                                                                         title------本兮 - 一直在等
                                                                         album------null
                                                                         artist------<unknown>
                                                                         duration------4:12
                                                                         size------3.85
                                                                         path------/storage/emulated/0/kgmusic/download/本兮 - 一直在等.mp3
                                                                         ---------------------------------------------
07-29 13:42:53.883 18468-18468/com.wxw.mengyuan.musictest_1 E/musicInfo: id=268
                                                                         title------简弘亦 - 小幸运
                                                                         album------null
                                                                         artist------<unknown>
                                                                         duration------4:27
                                                                         size------4.08
                                                                         path------/storage/emulated/0/kgmusic/download/简弘亦 - 小幸运.mp3
                                                                         ---------------------------------------------
在实体类的toString()方法打印出来的结果中,要注意的点有:
1、专辑不一定有:null即是该歌曲信息中未包含“专辑”
2、歌手不一定有:<unkown>即是该歌曲信息中的歌手是"未知歌手"
3、歌曲时间记得转换,将时长数转换成分秒
4、文件大小是b,需要转换成Mb





猜你喜欢

转载自blog.csdn.net/wxw20147854/article/details/76359942