当我们要获取手机上的某一种资源的时候,如果直接遍历手机上的文件,这样既浪费大量时间也会占用手机大量的资源,这是一种得不偿失的做法。这篇文章在我吸取了大牛们的经验和实践来的。
今天跟大家讲讲如何通过内容提供者获取手机中的音乐资源。
一般我们需要用到的关于音乐的信息有:歌名、专辑、歌手、歌曲时间、文件大小、歌曲路径。为了更好的进行操作,我创建了一个实体类:代码如下:
在Activitiy中创建了一个方法,内容即是通过内容提供者获取音乐资源:/** * 音乐的实体类 * */ 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; } }
/** * 从内容提供者获取歌曲信息 * @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
---------------------------------------------
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