这两天因为坐火车,所以就给耽搁了点,实在不好意思,接着上次的来说开始实现本地音乐播放的实现,首先第一步要做的就是获取本地音乐的数据,如何获得呢??
解决问题就是通过ContentResolver获取本地音乐数据,下载的本地音乐会默认的在data/data/com.android.providers.media文件夹的databases中的external.db本地数据库中audio-(View)中自动添加音乐数据,如图所示
然而我们可以通过ContentResolver进行增、删、改、查等常见操作
ContentProvider向外界提供数据操作的接口:
query(Uri, String[], String, String[], String)
insert(Uri, ContentValues)
update(Uri, ContentValues, String, String[])
delete(Uri, String, String[])
这里主要讲解ContentResolve.query(Uri uri,String[] projection, String selection, String[] selectionArgs,String sortOrder)
Uri :统一资源定位符
projection:列的字段名
selection:设置条件,相当于SQL语句中的where
selectionArgs:设置的参数,与selection结合使用
sortOrder:排序的方式
具体示例如下:
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI 这为本地音乐的Uri路径
projection就是我们要取的列名,Import一个media类
SongsActivity.java
public class SongsActivity extends Activity {
private List<MusicData> list=new ArrayList<MusicData>();
private MediaPlayer mp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_songs);
final ListView listview=(ListView)findViewById(R.id.listView);
String[] projection = new String[]{MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.ARTIST};
Cursor cursor=getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, null, null, null);
if (cursor != null)
{
cursor.moveToFirst();
int colNameIndex = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
int colTimeIndex = cursor.getColumnIndex(MediaStore.Audio.Media.DURATION);
int colPathIndex = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);
/**
* 直接截取字符串 ,吧作家名取出来
*ypc20150708
*by1656612697@qq.com
*/
//int colArtistIndex = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
int fileNum = cursor.getCount();
for(int counter = 0; counter < fileNum; counter++){
MusicData data = new MusicData();
data.mMusicName = cursor.getString(colNameIndex);
//System.out.println(data.mMusicName);
data.mMusicTime = cursor.getInt(colTimeIndex);
//System.out.println(data.mMusicTime);
data.mMusicPath = cursor.getString(colPathIndex);
//System.out.println(data.mMusicPath);
data.mMusicAritst=data.mMusicName.split("-")[0];
//data.mMusicAritst = cursor.getString(colArtistIndex);
//System.out.println(data.mMusicAritst);
list.add(data);
cursor.moveToNext();
}
cursor.close();
}
final ListViewAdapter myadapter=new ListViewAdapter(SongsActivity.this, list);
listview.setAdapter(myadapter);
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
final int position, long id) {
// TODO Auto-generated method stub
new Thread(new Runnable() {
@Override
public void run() {
Intent intent=new Intent(SongsActivity.this,PlayActivity.class);
intent.putExtra("songName",list.get(position).mMusicName);
intent.putExtra("playName",list.get(position).mMusicAritst);
intent.putExtra("url", list.get(position).mMusicPath);
intent.putExtra("duration", list.get(position).mMusicTime);
startActivity(intent);
//player.playUrl(url);
}
}).start();
}
});
}
}
MusicData.java
public class MusicData implements Parcelable{
public final static String KEY_MUSIC_DATA = "MusicData";
private final static String KEY_MUSIC_NAME = "MusicName";
private final static String KEY_MUSIC_TIME = "MusicTime";
private final static String KEY_MUSIC_PATH = "MusicPath";
private final static String KEY_MUSIC_ARITST = "MusicAritst";
public String mMusicName;
public int mMusicTime;
public String mMusicPath;
public String mMusicAritst;
public MusicData()
{
mMusicName = "";
mMusicTime = 0;
mMusicPath = "";
mMusicAritst = "";
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
Bundle mBundle=new Bundle();
mBundle.putString(KEY_MUSIC_NAME, mMusicName);
mBundle.putInt(KEY_MUSIC_TIME, mMusicTime);
mBundle.putString(KEY_MUSIC_PATH, mMusicPath);
mBundle.putString(KEY_MUSIC_ARITST, mMusicAritst);
dest.writeBundle(mBundle);
}
public static final Parcelable.Creator<MusicData> CREATOR = new Parcelable.Creator<MusicData>()
{
@Override
public MusicData createFromParcel(Parcel source) {
// TODO Auto-generated method stub
MusicData Data = new MusicData();
Bundle mBundle=new Bundle();
mBundle = source.readBundle();
Data.mMusicName = mBundle.getString(KEY_MUSIC_NAME);
Data.mMusicTime = mBundle.getInt(KEY_MUSIC_TIME);
Data.mMusicPath = mBundle.getString(KEY_MUSIC_PATH);
Data.mMusicAritst = mBundle.getString(KEY_MUSIC_ARITST);
return Data;
}
@Override
public MusicData[] newArray(int size) {
// TODO Auto-generated method stub
return new MusicData[size];
}
};
}
这样我们就得到了一个有关音乐属性例如作曲名,文件大小,专辑名等属性的一个list对象集合,下次将配合自定义的BaseAdapter将这个list以我们自定义的方式显示