9

Android音乐播放器实践(一)

 3 years ago
source link: https://felixxiong.github.io/2020/09/18/Android%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8%E5%AE%9E%E8%B7%B5%EF%BC%88%E4%B8%80%EF%BC%89/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

重新做一个简单的小项目,在一年后,争取进入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" />

编写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的坑的内容。 ↩︎


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK