Android音乐播放器实践(一)

重新做一个简单的小项目,在一年后,争取进入android技术开发的行列中。

至于一直未能加入技术开发行业的原因,本博客将会进行展开,其实也是总所周知的原因。

本篇文章其实挺突然的,从笔记就突然变成了一篇分享出来的博客,记录自己的“重学成长”。

引言

从音乐播放器开始做起。Why MusicPlayer?

其中涉及列表展示,多线程,媒体等等,以及一年前自己开始写了一个较为大而全的项目,其中就有音乐播放器的功能[1]

本文为第一部分,仅列出将本地音乐显示在列表里的基本步骤,以及把业务逻辑写在fragment中的一些坑。

后续在本文的知识点中,会增加相应链接,跳转到我的笔记[2]中。

所需知识点

Java:javaBean类、遍历(主要为while循环)、泛型、集合(List<>)

Android:

列表:ListView或RecycleView及生成:Adapter、ViewHolder

媒体:ContentProvider、ContentReserver、MediaStore

开始编写

界面

  1. 使用ListView或RecycleView编写基本列表
  2. 编写音乐播放控制条(上一曲下一曲)
  3. 编写音乐条目的单个item

主要业务逻辑

注:findViewById相关步骤省略,若音乐的界面写在fragment内,前面需要getView()[3]

基本步骤

加入权限

AndroidManiFest.xml中加入读写权限:

1
2
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Bean

编写MusicBean类,(根据单个item中包含的内容为参考),生成getter与setter方法与构造方法,作为List的泛型对象存在被传入

数据源

初始化数据源:MusicBean

1
List<MusicBean> = new arrayList()

Adapter相关

编写适配器:

  1. 创建Adapter对象继承自Adapter(根据使用的列表而定)、

  2. 创建ViewHolder类继承自ViewHolder(根据使用的列表而定)

  3. 并重写三个方法并设置适配器:

    3.1. 在ViewHolder里使用itemView与绑定ID对控件进行查找

    3.2. 定义Context与List数据源,并使用构造函数传递(为什么?)

1
2
3
4
5
6
7
8
9
public class LocalMusicAdapter extends RecyclerView.Adapter<LocalMusicAdapter.LocalMusicViewHolder> {

Context context;
List<LocalMusicBean> musicDataBean;

public LocalMusicAdapter(Context context, List<LocalMusicBean> musicDataBean) {
this.context = context;
this.musicDataBean = musicDataBean;
}

​ 3.3 创建Adapter对象继承自Adapter:泛型中传入ViewHolder,重写三个方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public LocalMusicViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 
//创建ViewHolder(对象)并返回,作用:生成与初始化每一个ViewHolder
View view = LayoutInflater.from(context).inflate(R.layout.item_music,parent,false);
LocalMusicViewHolder holder = new LocalMusicViewHolder(view);
return holder;
}

@Override
public void onBindViewHolder(@NonNull LocalMusicViewHolder holder, int position) {
//查找并绑定数据展示
LocalMusicBean musicBean = musicDataBean.get(position); //拿到Bean
holder.songName.setText(musicBean.getSongName());
holder.artistName.setText(musicBean.getArtistName());
holder.albumName.setText(musicBean.getAlbumName());
}

@Override
public int getItemCount() { //有多少条目就返回多少条目
return musicDataBean.size();
}

布局管理器

创建布局管理器,设置为何种布局(横向滑动/瀑布流等),使用LinearLayoutManager并设置

加载文件

使用ContentResolver-获取本地音乐URL地址

使用Cursor(游标)进行查询(resolver.query()方法),之后进行遍历

TODO:Fragment的坑

如果将业务逻辑以Fragment的形式写在App项目中:

需考虑应用使用何种导航形式:侧滑菜单/底部Tab/ViewPager+Fragment,以及不同的展现方法。

确定好应用结构之后:

TODO:将fragment放进MainActivty.java中。

直接写Context报错

fragment中无法直接调用findViewById与Context。(为什么?)

TODO:什么是context?他在App中开发的作用?

1
2
3
4
5
localMusicAdapter = new LocalMusicAdapter(getContext(),musicDataBean);
mRecycleView.setAdapter(localMusicAdapter);

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext(),LinearLayoutManager.VERTICAL,false);
mRecycleView.setLayoutManager(linearLayoutManager);


  1. 即使如此,到现在也是半成品,所以这也是未能入行的原因之一:没有一个完整的项目,于是精简就开始了。 ↩︎

  2. 我的笔记大都是用语雀进行记录。 ↩︎

  3. 这也是段落Fragment的坑的内容。 ↩︎

FelixXiong wechat
产品北里,讲述产品和人性、涉及设计、技术和运营的公众号。
你们的赞赏是我更新的动力~