您的位置:首页 > 理论基础 > 计算机网络

基于android的网络音乐播放器-回调实现音乐播放及音乐收藏的实现(三)

2017-04-06 09:35 781 查看
作为android初学者,最近把疯狂android讲义和疯狂Java讲义看了一遍,看到书中介绍的知识点非常多,很难全部记住,为了更好的掌握基础知识点,我将开发一个网络音乐播放器-EasyMusic来巩固下,也当作是练练手。感兴趣的朋友可以看看,有设计不足的地方也欢迎指出。

开发之前首先介绍下该音乐播放器将要开发的功能(需求):

1.本地音乐的加载和播放;

2.网络音乐的搜索,试听和下载;

3.音乐的断点下载;

4.点击播放图标加载专辑图片,点击歌词加载歌词并滚动显示(支持滑动歌词改变音乐播放进度);

5.支持基于popupWindow的弹出式菜单;

6.支持后台任务栏显示和控制。

该篇主要介绍音乐的回调播放及收藏音乐的实现,其中音乐的收藏需要用到SQLite数据库:

1.回调监听实现音乐的点击播放

该部分对MusicListFragment 的主要修改如下

public class MusicListFragment extends Fragment {
......
private CallBack mCallBack;
.....
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.musiclist, container, false);
musicListView = (ListView)view.findViewById(R.id.musicList);
musicListView.setAdapter(musicListAdapter);
musicListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//mCallBack指向MainActivity,实际调用的是MainActivity的onItemSelected方法
mCallBack.onItemSelected((String)dbMusic.get(position).get("url"));
TextView title = (TextView)view.findViewWithTag("title");
Toast.makeText(mContext, "title = " + title.getText().toString(), Toast.LENGTH_SHORT).show();
}
});
return view;
}
/**
* 回调接口指向MainActivity,因为MainActivity实现了CallBack接口,所有这里用到了多态-父类引用指向子类对象,然后在该Fragment中可
* 通过mCallBack调用MainActivity播放音乐的方法
*/
public void onAttach(Activity activity) {
super.onAttach(activity);
mCallBack = (CallBack)activity;
}

public interface CallBack {
public void onItemSelected(String url);
}
}


MainActivity还需要实现MusicListFragment的内部接口CallBack,这样当点击音乐列表时即可调用MainActivity的onItemSelected方法,实现音乐的播放,MainActivity的调整如下:

public class MainActivity extends FragmentActivity implements MusicListFragment.CallBack, View.OnClickListener {
......
@Override
public void onItemSelected(String url) {
playMusic(url);
}
}


2.音乐收藏的实现

这里设计的收藏思路为:点击音乐后端的五角星实现五角星的点亮和熄灭,分别对应收藏和取消收藏,收藏任务的执行使用异步任务,异步任务定义为MusicListFragment的内部类,其定义如下:

//执行收藏音乐/取消收藏的异步任务
private class MyAsyncTask extends AsyncTask<String, Void, Void> {
private ImageView starView;
private Map<String, Object> musicInfo;
private boolean storeSuccess;

public MyAsyncTask(ImageView starView, Map<String, Object> musicInfo) {
this.starView = starView;
this.musicInfo = musicInfo;
}

protected void onPreExecute() {
super.onPreExecute();
}

protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}

protected Void doInBackground(String... params) {
Log.d(TAG, "doInBackground");
Cursor cursor = myHelper.getReadableDatabase().rawQuery("select * from stored_music", null);
while (cursor.moveToNext()) {
String title = cursor.getString(1);
String artist = cursor.getString(2);
Log.d(TAG, "title = " + title + " artist = " + artist);
Log.d(TAG, "musicInfo.title = "+(String)musicInfo.get("title")+ " musicInfo.artist = "+(String)musicInfo.get("artist"));
if (title.equals((String)musicInfo.get("title")) && artist.equals((String)musicInfo.get("artist"))) {
//已经收藏的音乐取消收藏并移出收藏音乐表格-stored_music
myHelper.getReadableDatabase().execSQL("delete from stored_Music where title like ? and artist like ?",
new String[] {title, artist});
storeSuccess = false;
return null;
}
}
//未收藏的音乐加入到收藏中
myHelper.getReadableDatabase().execSQL("insert into stored_music values(null, ?, ?, ?, ?)",
new Object[] {musicInfo.get("title"),musicInfo.get("artist"),musicInfo.get("duration"),musicInfo.get("url")});
storeSuccess = true;
return null;
}

protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (storeSuccess) {
starView.setImageResource(android.R.drawable.btn_star_big_on);
Toast.makeText(mContext, "收藏成功", 100).show();
} else {
starView.setImageResource(android.R.drawable.btn_star_big_off);
Toast.makeTex
bf58
t(mContext, "取消收藏", 100).show();
}
}


当点击音乐的收藏图标-五角星时即可开启一个异步任务,当异步任务执行即为相应的收藏数据库音乐信息的增加和删除,执行完成完成后再点亮/熄灭五角星。另外,我们音乐收藏数据库的定义如下:

package com.sprd.easymusic.mysql;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDBHelper extends SQLiteOpenHelper {
//收藏音乐的数据表
private final String CREATE_TABLE_LOCALMUSIC = "create table stored_music(" +
"_id integer primary key autoincrement,title,artist,duration,url)";

public MyDBHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_LOCALMUSIC);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub

}

}


异步任务的启动源于收藏图标的监听:

// 音乐列表适配器
private BaseAdapter musicListAdapter = new BaseAdapter() {

@Override
public int getCount() {
return dbMusic.size();
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
Map<String, Object> item = dbMusic.get(position);
if (convertView == null) {
view = inflater.inflate(R.layout.musiclist_item, null);
}
final ImageView storeMusic = (ImageView) view.findViewById(R.id.love);
if (checkIfStored((String) item.get("url"))) {
storeMusic.setImageResource(android.R.drawable.btn_star_big_on);
} else {
storeMusic.setImageResource(android.R.drawable.btn_star_big_off);
}
//收藏或取消收藏的监听
storeMusic.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
new MyAsyncTask(storeMusic, dbMusic.get(position)).execute();
}
});
TextView musicTitle = (TextView) view.findViewById(R.id.musicTitle);
musicTitle.setTag("title");
TextView musicArtist = (TextView) view.findViewById(R.id.musicArtist);
musicTitle.setText((String) item.get("title"));
musicArtist.setText((String) item.get("artist"));
return view;
}

};


音乐收藏的关键代码就如上面所述,其他就不多讲了。当然在进入音乐列表的时候需要查询当前音乐是否被收藏了,是的话就需要点亮收藏图标,加上一个判断即可,上面代码中的checkIfStored((String) item.get(“url”))方法就是进行该判断的。

好了,该篇先讲这么多了,后面一篇我将把这些主要类的代码都贴上并附上效果图供大家参考。

音乐播放器已完成,下载地址:

Android音乐播放器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  音乐
相关文章推荐