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

作为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.makeText(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音乐播放器

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值