Android系统为我们建立起多媒体数据库之后,便把多媒体常用的信息,比如歌曲名、文件大小、播放时长、专辑、歌手等常用信息保存在了数据库里,那我们可以直接用多媒体库中的数据,完成这个需求。虽然我们需要用多媒体库,但是我们不能直接操作。Android为这些常用的需要共享的数据(多媒体和联系人等),创建了ContentProvider,因此,如果我们想获取到这些信息,我们就需要用ContentProvider。
bean:
public class Song extends FtpBaseBean{
private String title;
private String duration;
private String singer;
private String album;//唱片
private String year;
private String type;
private String size;
private Bitmap albumArt;//专辑封面
//private int state;//这是ftp上传的状态
//private UpLoadInfo info;//这是ftp上传的信息
private String remotePath = "/music/";
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDuration() {
return duration;
}
public void setDuration(String duration) {
this.duration = duration;
}
public String getSinger() {
return singer;
}
public void setSinger(String singer) {
this.singer = singer;
}
public String getAlbum() {
return album;
}
public void setAlbum(String album) {
this.album = album;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public Song() {
super();
}
public Song(String fileName, String title, String duration, String singer,
String album, String year, String type, String size, String locPath) {
super();
this.fileName = fileName;
this.title = title;
this.duration = duration;
this.singer = singer;
this.album = album;
this.year = year;
this.type = type;
this.size = size;
this.locPath = locPath;
}
@Override
public String toString() {
return "Song [fileName=" + fileName + ", title=" + title
+ ", duration=" + duration + ", singer=" + singer + ", album="
+ album + ", year=" + year + ", type=" + type + ", size="
+ size + ", fileUrl=" + locPath + "]";
}
public void setThumbnail(Bitmap albumArt) {
this.albumArt = albumArt;
}
public Bitmap getThumbnail() {
return albumArt;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getRemotePath() {
return remotePath;
}
public void setRemotePath(String remotePath) {
this.remotePath = remotePath;
}
public String getLocPath() {
return locPath;
}
public void setLocPath(String locPath) {
this.locPath = locPath;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public long getProgress() {
return progress;
}
public void setProgress(long progress) {
this.progress = progress;
}
public long getMax() {
return max;
}
public void setMax(long max) {
this.max = max;
}
}
util:
/**
* @Description: 音频文件帮助类
*/
public class AudioUtils {
/**
* 获取sd卡所有的音乐文件(仅限MP3和wma的)
* @return
* @throws Exception
*/
public static ArrayList<Song> getAllSongs() {
ArrayList<Song> songs = null;
Cursor cursor = UIUtils.getContext().getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.YEAR,
MediaStore.Audio.Media.MIME_TYPE,
MediaStore.Audio.Media.SIZE,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.ALBUM_ID,
},
null,
null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
songs = new ArrayList<Song>();
if (cursor.moveToFirst()) {
Song song = null;
do {
song = new Song();
// 文件名
song.setFileName(cursor.getString(1));//Over the Horizon.mp3
// 歌曲名
song.setTitle(cursor.getString(2));//Over the Horizon //有可能是乱码,最好是截取文件名
// 时长
song.setDuration(getMusicTime(cursor.getInt(3)));
// 歌手名
song.setSinger(cursor.getString(4));//Samsung or <unknown>
// 专辑名
song.setAlbum(cursor.getString(5));
// 年代
if (cursor.getString(6) != null) {
song.setYear(cursor.getString(6));
} else {
song.setYear("未知");
}
// 歌曲格式
if ("audio/mpeg".equals(cursor.getString(7).trim())) {
song.setType("mp3");
} else if ("audio/x-ms-wma".equals(cursor.getString(7).trim())) {
song.setType("wma");
}
// 文件大小
if (cursor.getString(8) != null) {
float size = cursor.getInt(8) / 1024f / 1024f;
if (size < 0.8) {//只过滤大于0.8M的音乐
continue;
}
song.setSize((size + "").substring(0, 4) + "M");
} else {
song.setSize("未知");
continue;
}
// 文件路径
if (cursor.getString(9) != null) {// /storage/emulated/0/Samsung/Music/Over the Horizon.mp3
song.setLocPath(cursor.getString(9));
/*Bitmap albumArt = createAlbumArt(song.getLocPath());//尝试过,基本获取不到缩略图
if (albumArt != null) {
song.setThumbnail(albumArt);
}*/
}
/*Bitmap bm = getArtwork(UIUtils.getContext(), cursor.getInt(0),
cursor.getInt(10), true);
if(bm!=null){
song.setThumbnail(bm);
}*/
songs.add(song);
} while (cursor.moveToNext());
cursor.close();
}
return songs;
}
/**
* 获取音乐播放时长,需要转换
*
* @return
*/
private static String getMusicTime(int duration) {
int musicTime = duration / 1000;
return musicTime / 60 + ":" + musicTime % 60;
}
/**
* @param filePath 文件路径,like XXX/XXX/XX.mp3
* @return 专辑封面bitmap
* @Description 获取专辑封面
*/
private static Bitmap createAlbumArt(final String filePath) {
Bitmap bitmap = null;
//能够获取多媒体文件元数据的类
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(filePath); //设置数据源
byte[] embedPic = retriever.getEmbeddedPicture(); //得到字节型数据
//if (embedPic != null) {
bitmap = BitmapFactory.decodeByteArray(embedPic, 0, embedPic.length); //转换为图片
//}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
retriever.release();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return bitmap;
}
}