基于android的网络音乐播放器-回调实现音乐播放及音乐收藏的实现(三)
2017-04-06 09:35
781 查看
作为android初学者,最近把疯狂android讲义和疯狂Java讲义看了一遍,看到书中介绍的知识点非常多,很难全部记住,为了更好的掌握基础知识点,我将开发一个网络音乐播放器-EasyMusic来巩固下,也当作是练练手。感兴趣的朋友可以看看,有设计不足的地方也欢迎指出。
开发之前首先介绍下该音乐播放器将要开发的功能(需求):
1.本地音乐的加载和播放;
2.网络音乐的搜索,试听和下载;
3.音乐的断点下载;
4.点击播放图标加载专辑图片,点击歌词加载歌词并滚动显示(支持滑动歌词改变音乐播放进度);
5.支持基于popupWindow的弹出式菜单;
6.支持后台任务栏显示和控制。
该篇主要介绍音乐的回调播放及收藏音乐的实现,其中音乐的收藏需要用到SQLite数据库:
1.回调监听实现音乐的点击播放
该部分对MusicListFragment 的主要修改如下
MainActivity还需要实现MusicListFragment的内部接口CallBack,这样当点击音乐列表时即可调用MainActivity的onItemSelected方法,实现音乐的播放,MainActivity的调整如下:
2.音乐收藏的实现
这里设计的收藏思路为:点击音乐后端的五角星实现五角星的点亮和熄灭,分别对应收藏和取消收藏,收藏任务的执行使用异步任务,异步任务定义为MusicListFragment的内部类,其定义如下:
当点击音乐的收藏图标-五角星时即可开启一个异步任务,当异步任务执行即为相应的收藏数据库音乐信息的增加和删除,执行完成完成后再点亮/熄灭五角星。另外,我们音乐收藏数据库的定义如下:
异步任务的启动源于收藏图标的监听:
音乐收藏的关键代码就如上面所述,其他就不多讲了。当然在进入音乐列表的时候需要查询当前音乐是否被收藏了,是的话就需要点亮收藏图标,加上一个判断即可,上面代码中的checkIfStored((String) item.get(“url”))方法就是进行该判断的。
好了,该篇先讲这么多了,后面一篇我将把这些主要类的代码都贴上并附上效果图供大家参考。
音乐播放器已完成,下载地址:
Android音乐播放器
开发之前首先介绍下该音乐播放器将要开发的功能(需求):
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音乐播放器
相关文章推荐
- 基于android的网络音乐播放器-播放音乐及收藏音乐的效果展示(四)
- 基于android的网络音乐播放器-播放控制界面(九)
- 基于android的网络音乐播放器-本地音乐的加载和后台播放(一)
- 基于android的网络音乐播放器-添加viewpager和fragment实现滑动切换多个界面(二)
- Android开发本地及网络Mp3音乐播放器(六)实现独立音乐播放界面
- Android实现网络音乐播放器
- Android实战 - 音心播放器 (通知实现音乐的播放/暂停/下一曲控制)
- 基于android的网络音乐播放器-网络音乐的多线程下载(六)
- 基于android的网络音乐播放器-通知栏控制(RemoteViews)(十)
- 基于android的网络音乐播放器-下载任务的暂停/继续/删除以及断点下载(七)
- Android实战 - 音心播放器 (MusicActivity-音乐播放页面界面实现)
- 22_Android中的本地音乐播放器和网络音乐播放器的编写,本地视频播放器和网络视频播放器,照相机案例,偷拍案例实现
- Android开发本地及网络Mp3音乐播放器(四)实现音乐播放
- Android-简单播放器——播放( 应用程序、内存卡以及网络音乐)
- Android开发本地及网络Mp3音乐播放器(六)实现独立音乐播放界面
- 基于android的网络音乐播放器-下载完成后下拉音乐列表刷新(八)
- Android本地及网络音乐播放器-播放界面显示(二)
- Android开发本地及网络Mp3音乐播放器(四)实现音乐播放
- Android本地及网络音乐播放器-播放本地音乐(一)
- Android基于service实现音乐的后台播放功能示例