android音乐播放器开发教程
1、关于音乐列表的读取,不同的音乐播放器都会有不同的方案,有的是有多重方案并用。例如说,全盘扫描音乐格式文件等。
首先我封装了一个Audio类来存储读取的音频信息:
public class MediaUtils {
public static final String[] AUDIO_KEYS = new String[]{
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.TITLE_KEY,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ARTIST_ID,
MediaStore.Audio.Media.ARTIST_KEY,
MediaStore.Audio.Media.COMPOSER,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media.ALBUM_KEY,
MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Media.SIZE,
MediaStore.Audio.Media.YEAR,
MediaStore.Audio.Media.TRACK,
MediaStore.Audio.Media.IS_RINGTONE,
MediaStore.Audio.Media.IS_PODCAST,
MediaStore.Audio.Media.IS_ALARM,
MediaStore.Audio.Media.IS_MUSIC,
MediaStore.Audio.Media.IS_NOTIFICATION,
MediaStore.Audio.Media.MIME_TYPE,
MediaStore.Audio.Media.DATA
};
public static List<Audio> getAudioList(Context context) {
List<Audio> audioList = new ArrayList<Audio>();
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
AUDIO_KEYS,
null,
null,
null);
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
Bundle bundle = new Bundle ();
for (int i = 0; i < AUDIO_KEYS.length; i++) {
final String key = AUDIO_KEYS[i];
final int columnIndex = cursor.getColumnIndex(key);
final int type = cursor.getType(columnIndex);
switch (type) {
case Cursor.FIELD_TYPE_BLOB:
break;
case Cursor.FIELD_TYPE_FLOAT:
float floatValue = cursor.getFloat(columnIndex);
bundle.putFloat(key, floatValue);
break;
case Cursor.FIELD_TYPE_INTEGER:
int intValue = cursor.getInt(columnIndex);
bundle.putInt(key, intValue);
break;
case Cursor.FIELD_TYPE_NULL:
break;
case Cursor.FIELD_TYPE_STRING:
String strValue = cursor.getString(columnIndex);
bundle.putString(key, strValue);
break;
2、以上类来封装音乐媒体信息,一些变量看名字也能看出来是什么,例如说title,duration此类,无非就是歌曲名称,时长之类的信息,有些变量名字单词认识,但是并不知道干什么用,其实我也不知道是什么信息,虽然打印出来过,但是并不懂到底哪里能用到,反正一股脑都读出来了先,以后再打印输出看看都是些什么。
return isMusic;
}
public boolean isNotification () {
return isNotification;
}
public String getTitle () {
return mTitle;
}
public String getTitleKey () {
return mTitleKey;
}
public String getArtist () {
return mArtist;
}
public int getArtistId () {
return mArtistId;
}
public String getArtistKey () {
return mArtistKey;
}
public String getComposer () {
return mComposer;
}
public String getAlbum () {
return mAlbum;
}
public int getAlbumId () {
return mAlbumId;
}
public String getAlbumKey () {
return mAlbumKey;
}
public String getDisplayName () {
return mDisplayName;
}
public int getYear () {
return mYear;

3、如此返回一个Audio的List,现在我们可以用这个List做一个列表展示。

4、Android本身有媒体库,可以读取本地媒体库的数据,来快速获知设备上的音乐。

5、在以往的Android开发中,遇到列表,都要用到RecyclerView,这是谷歌所提倡的用来代替ListView的控件。相比ListView要更灵活,自由度更大,比如在做表格分割线的时候,就比Listview好用多了。 但是在使用RecyclerView的Adapter的时候,必须返回一个ViewHolder,类似于ListView的BaseAdapter中的getView方法。而且要根据不同的ViewType返回不同的ViewHolder,才能在一个RecyclerView中显示几个样式的数据。
