MediaStore部分属性解释
最近尝试开发一个Android的音乐播放器,其中用到了MediaStore获取系统内部的歌曲等信息,先将此总结一下。
歌曲信息
//获取歌曲在系统中的id
MediaStore.Audio.Media._ID
//获取歌曲的歌名
MediaStore.Audio.Media.TITLE;
//获取歌曲所在专辑的id
MediaStore.Audio.Media.ALBUM_ID;
//获取专辑的歌手名
MediaStore.Audio.Media.ARTIST
//获取歌曲的时长
MediaStore.Audio.Media.DURATION
//获取歌曲的大小
MediaStore.Audio.Media.SIZE
//获取专辑名
MediaStore.Audio.Media.ALBUM
//获取歌曲路径,如xx/xx/xx.mp3
ediaStore.Audio.Media.DATA
专辑信息
//获取专辑id
MediaStore.Audio.Albums._ID
//获取专辑名
MediaStore.Audio.Albums.ALBUM
//获取专辑歌手
MediaStore.Audio.Albums.ARTIST
//获取专辑歌曲数
MediaStore.Audio.Albums.NUMBER_OF_SONGS
歌手信息
//歌手id
MediaStore.Audio.Artists._ID
//歌手名
MediaStore.Audio.Artists.ARTIST
//歌手歌曲数
MediaStore.Audio.Artists.NUMBER_OF_TRACKS
文件夹
利用ContentProvider查询的Uri如下:
//查询歌曲信息
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
//查询专辑信息
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
//查询歌手信息
MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI;
//查询文件信息
MediaStore.Files.getContentUri("external");
//具体查询方法,以查询手机中的歌曲为例。
private static final Uri QUERY_SONG_URI = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
/**
* 查询手机里歌曲信息的列
*/
private static final String[] SONG_PROJECTION = new String[]{
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media.SIZE,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ARTIST_ID,
MediaStore.Audio.Media.DURATION
};
public static List<SongInfo> querySongInfos(Context context) {
ContentResolver cr = context.getContentResolver();
Cursor cursor = cr.query(
QUERY_SONG_URI,
SONG_PROJECTION, null, null,
MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
return parseSongCursor(cursor);
}
private static List<SongInfo> parseSongCursor(Cursor cursor) {
List<SongInfo> songInfos = new ArrayList<>();
while (cursor.moveToNext()) {
SongInfo songInfo = new SongInfo();
songInfo.setSongId(cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media._ID)));
songInfo.setSongName(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)));
songInfo.setAlbumId(cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)));
songInfo.setArtist(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)));
songInfo.setDuration(cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)));
songInfo.setSize(cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE)));
songInfo.setAlbum(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)));
//data就是路径,xx/xx/xx.mp3
String filePath = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
songInfo.setData(filePath);
String folder = filePath.substring(0, filePath.lastIndexOf(File.separator));
songInfo.setFolder(folder);
songInfos.add(songInfo);
}
return songInfos;
}
SongInfo类如下:
public class SongInfo{
/**
* 歌曲id
*/
private int songId;
/**
* 专辑id
*/
private int albumId;
/**
* 歌名
*/
private String songName;
/**
* 歌手
*/
private String artist;
/**
* 时长
*/
private int duration;
/**
* 大小
*/
private long size;
/**
* uri
*/
private String data;
/**
* 专辑
*/
private String album;
/**
* 文件夹路径
*/
public String folder;
public SongInfo() {
}
public String getAlbum() {
return album;
}
public void setAlbum(String album) {
this.album = album;
}
public int getAlbumId() {
return albumId;
}
public void setAlbumId(int albumId) {
this.albumId = albumId;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public int getDuration() {
return duration;
}
public void setDuration(int duration) {
this.duration = duration;
}
public String getFolder() {
return folder;
}
public void setFolder(String folder) {
this.folder = folder;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
public int getSongId() {
return songId;
}
public void setSongId(int songId) {
this.songId = songId;
}
public String getSongName() {
return songName;
}
public void setSongName(String songName) {
this.songName = songName;
}
}
附加一个通过歌曲文件获得歌曲内部的专辑封面的方法。
/**
根据歌曲路径获得专辑封面
* @Description 获取专辑封面
* @param filePath 文件路径,like XXX/XXX/XX.mp3
* @return 专辑封面bitmap
*/
public static Bitmap createAlbumArt(final String filePath) {
Bitmap bitmap = null;
//能够获取多媒体文件元数据的类
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(filePath); //设置数据源
byte[] embedPic = retriever.getEmbeddedPicture(); //得到字节型数据
//bitmap = BitmapFactory.decodeByteArray(embedPic, 0, embedPic.length); //转换为图片
//要优化后再加载
bitmap=BitmapUtil.decodeBitmapByByteArray(embedPic,80,80);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
retriever.release();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return bitmap;
}