作为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{

private ImageView starView;

private MapmusicInfo;

private boolean storeSuccess;

public MyAsyncTask(ImageView starView, MapmusicInfo) {

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;

Mapitem = 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的网络音乐播放器-回调实现音乐播放及音乐收藏的实现(三)...相关推荐

  1. android跳蚤市场的功能,基于Android校园跳蚤市场设计与实现.doc

    基于Android校园跳蚤市场设计与实现 基于Android校园跳蚤市场设计与实现 摘要:论文主要实现了一个基于Android平台的校园跳蚤市场系统.该系统上是以Android为终端,实现二手商品信息 ...

  2. android餐厅菜单功能,基于Android平台的菜谱实现

    <基于Android平台的菜谱实现>由会员分享,可在线阅读,更多相关<基于Android平台的菜谱实现(20页珍藏版)>请在人人文库网上搜索. 1.基于安卓平台的菜谱实现1需求 ...

  3. Android开发收音机功能,基于Android系统的FM收音机功能的设计与实现

    摘要: 随着移动互联网时代的到来,智能移动终端产业也迎来了繁荣期.各手机厂商争相推出自己的智能手机和平板电脑.其中安卓系统由于其源码的开放性以及不错的用户体验,而得到了各大手机厂商以及手机应用开发人员 ...

  4. Android开发自学笔记(基于Android Studio1.3.1)—1.环境搭建(转)

    一.引言    本套学习笔记的开发环境是Windows 10 专业版和Android Studio 的最新版1.3.1. Android Studio 是一个Android开发环境,基于Intelli ...

  5. Android开发自学笔记(基于Android Studio1.3.1)—1.环境搭建

    一.引言 本套学习笔记的开发环境是Windows 10 专业版和Android Studio 的最新版1.3.1. Android Studio 是一个Android开发环境,基于IntelliJ I ...

  6. Android开发介绍(基于Android Studio软件)

    Android开发介绍(基于Android Studio软件) 关于Android开发,笔者走过一些弯路,因此今天总计了有关Android开发的一些内容和心得,希望对大家有所帮助.首先来一张安卓开发者 ...

  7. Android Studio多功能闹钟[android源码]

    Android Studio多功能闹钟[android源码] 多功能闹钟App 简 介 主 要 技 术 界面截图 主要代码 源码链接 作者信息 多功能闹钟App 简 介 此多功能闹钟界面采用TabHo ...

  8. Android 11.0 任务栏中清除掉播放器的进程,状态栏仍有音乐播放器状态问题的解决

    1.概述 在11.0的rom定制化开发中,在点击系统自带的播放器以后,播放音乐的时候,在最近任务栏recents列表中,点击全部清除,发现音乐播放器还在播放音乐,导致出现bug,完整的 解决方法,肯定 ...

  9. dplayer播放器增加记忆 P2P播放 自动下一集 弹幕功能

    搭建过苹果cms的都知道,苹果cms自带的播放器都特别拉跨 如:DP ali这些都只要一些基础的功能,但是现在这些功能都都满足不了用户群体,所以今天小编给大家带来一款二改过的播放器新增了记忆播放,P2 ...

最新文章

  1. Linux系统结构学习
  2. Science发布2021年度十大科学突破榜单:除了AlphaFold2,还有哪些大丰收?
  3. 如何告别半途而废——韦东山嵌入式Linux视频学习笔记00
  4. sqlite的几个常用方法
  5. 3.4 实用的path变量
  6. 暑期训练狂刷系列——Foj 1894 志愿者选拔 (单调队列)
  7. CF 670C Cinema(算竞进阶习题)
  8. php 结构体_【开发规范】PHP编码开发规范下篇:PSR-2编码风格规范
  9. MapReduce操作时Error:The method setInputPaths(JobConf, String) in the type FileInputFormat is not
  10. soapUI-JDBC Request
  11. 《JavaScript设计模式》——11.3 站长统计
  12. Bash Shell 的一些语法
  13. springboot打成jar包,在windows上运行出现乱码
  14. O365 Onedrive使用手册
  15. smbd of samba-3.0.23b internal
  16. 【计算机网络】第八话 · 数据链路层的功能
  17. 【音乐系列】吉他学习入门基本知识
  18. JZ-008-跳台阶
  19. Python调用纷享销客CRM开放平台API
  20. 小红书 程序员七夕礼物 - 微信每日早安推送,简单无坑的最新教程

热门文章

  1. Speedoffice(excel)如何隐藏行号和列标
  2. 软件开发风险处理 常见5种情况
  3. 网络浏览器 Google Chrome 在线升级便携版
  4. 如何使用Github实现协同工作
  5. AWS EC2文件上传
  6. java求100的阶乘
  7. 【文学】平凡的世界第一部
  8. 随印自助打印机,微信文档文件校园共享无人自助打印方案
  9. shape context-形状上下文
  10. 三步解决!Word2010 论文格式的多级标题设置,标号与文字之间间隔过大问题