基于Android的音乐播放软件的设计与实现.doc
基于Android的音乐播放软件的设计与实现学 院:专 业:姓 名:指导老师:计算机学院计算机科学与技术高锦朋学 号:职 称:160201102971许婷讲师中国·珠海二二年五月北京理工大学珠海学院2020届本科生毕业设计诚信承诺书本人郑重承诺:本人承诺呈交的毕业设计基于Android的音乐播放软件的设计与实现是在指导教师的指导下,独立开展研究取得的成果,文中引用他人的观点和材料,均在文后按顺序列出其参考文献,设计使用的数据真实可靠。本人签名: 高锦朋 日期: 2020 年 5 月 1 日 基于Android的音乐播放软件的设计与实现摘 要随着社会的发展以及人们生活水平的提高,音乐文化逐渐成为当今社会主流文化之一,走进了每个人的生活,让人们得到了更好的放松、享受以及娱乐。与之崛起的就是 音乐播放软件,它不仅可以让人们具有随时随地享受音乐,还能根据用户习惯推荐歌曲和歌单、评论互动等,营造了良好的音乐氛围。本文所设计的音乐播放软件共分五个功能模块页面,“发现”页和“我的”页可以保存用户收藏的音乐,并根据用户的音乐风格偏好推荐歌曲。同时规划出“视频”页、“动态”页两个功能页面丰富用户的娱乐内容,“动态”页面会从本地服务端获取图片。“账号”页会保存用户的基本信息。界面风格会以黑色和红色混搭为主。本文主要通过本地音乐和视频的播放控制的功能实现,介绍MediaPlayer和Service的搭配使。借助BroadCastReceiver、Intent等实现不同软件页面间的信息交互。同时,将会使用自定义View美化控件外观。关键词: 音频播放控制、界面风格、移动开发、服务端 The design and realization of music player software based on AndroidAbstractWith the development of the society and the improvement of people's living standard, music culture has gradually become one of the mainstream culture in today's society, which has entered everyone's life and made people get better relaxation, enjoyment and entertainment.With its rise is the music playing software, which not only enables people to enjoy music anytime and anywhere, but also can recommend songs and playlists, comments and interactions according to users' habits, creating a good music atmosphere.This work is divided into five functional pages, "discover" page and "my" page can save the user's music collection, and according to the user's music style preference to recommend songs.At the same time, two functional pages of "video" page and "dynamic" page are planned to enrich the entertainment content of users. The "dynamic" page will get pictures from the local server.The account page holds the user's basic information.The interface will be a mix of black and red.This article mainly through the local music and video playback control function to achieve, introduced the MediaPlayer and Service collocation.With the help of BroadCastReceiver, Intent, etc., information interaction between different software pages can be realized.Also, a custom View will be used to beautify the appearance of the control.Keywords: Audio playback control, interface style, mobile development, server目 录1 前言61.1 本设计的目的、意义61.2 国内流行的音乐播放软件简介61.3 本设计中的主要功能模块72开发和运行的环境72.1开发软件的工具72.2软件运行的环境73 软件功能实现83.1 UI布局模块83.1.1五大页面之间的跳转83.1.2 “发现”页-DiscoveryFragment的布局93.1.3 “视频”页-VideoFragment的布局153.1.4 “我的”页-MineyFragment的布局163.1.5 “动态”页-DynamicsFragment的布局183.1.6 “账号”页-AccountFragment的布局193.1.7 “浸入式”状态栏213.2本地音乐播放模块223.2.1功能需求分析与实现分析223.2.2获取本地音乐233.2.3在Service中实现MediaPlayer233.2.4歌单页面243.2.5歌曲播放页面243.2.6在MainActivity中实现自动切换下一首歌273.3本地视频播放模块273.4获取本地服务端的图片273.4.1用xampp搭建本地服务端 273.4.2 获取本地服务端的图片294结论30参考文献31致谢321 前言音乐播放软件是一种用于播放各种音乐文件的多媒体播放软件,它涵盖了各种音乐的播放工具,界面美观,操作简单,是如今听音乐的必备软件。1.1本设计的目的、意义在移动端市场里,智能手机是用户的第一选择,据IDC的最新报告,2019年Android智能手机占全球手机市场份额的87%。Android软件借助着发达移动通信技术和计算机网络技术的功能,使其自身功能上更加丰富强大,加上美观且人性化UI界面满足了用户的基本需求,提供了用户体验感。本文通过对基于Android平台的音乐播放软件的研究、设计,展示Android的基本布局、网络操作、数据存储、数据通信以及多媒体开发等基本技术,体现当前受欢迎的音乐播放软件的风格设计以及基本功能。小巧且功能强大的音乐播放软件是当下及未来的一种必然趋势,作为一名音乐爱好者能设计一款Android音乐播放器,为人们空闲之时带来良好的音乐享受体验,是一件非常有荣誉感的事情。1.2国内流行的音乐播放软件简介目前,国内比较流行的音乐播放软件有 网易云音乐播放器、QQ音乐播放器、酷狗音乐播放器等,它们都具备各自的特点,吸引了一批自己的音乐爱好者粉丝,并在这一方面占有了各自的市场。在这里简单地介绍一下现在国内流行的音乐播放软件。1)网易云音乐播放器网易云音乐播放器是一款网易公司打造的音乐播放器,由网易杭州研究院的开发,与专业音乐人、DJ、自由音乐创造者、主播等合作,开发了好友推荐、动态评论以及社交等功能。网易云音乐播放器是一款很“体贴”的音乐播放器,它的“个性化推荐”、“私人FM”功能会根据用户的爱好自动匹配歌曲,也是国内音乐播放软件中拥有海量“歌单”的音乐播放器,让用户更容易遇见优质音乐。2)QQ音乐播放器QQ音乐播放器是腾讯公司开发的音乐播放平台,是国内正版数字音乐服务的音乐平台领航者,有着独特个性的主题风格,以大数据和互联网为推动力,始终走在音乐潮流的最前端,同时支持在线播放和本地播放,有着千万量级的正版乐库。3)酷狗音乐播放器酷狗音乐播放器是中国领先的数字音乐交互提供商,互联网技术创新的领军企业。酷狗音乐主打“听”、“看”“唱”三大功能,“听”模块以丰富的曲库为基石,“看”模块配合MV和直播打造,“唱”模块实现在线K歌版块。1.3本设计中的主要功能模块在这音乐播放软件的设计中,实现的主要功能如下:1. 本地音乐的播放控制;2. 本地视频的播放控制;3. 从搭建本地的服务端中获取网络图片;4. 美观的UI布局。2 开发和运行的环境2.1开发软件的工具该音乐播放软件是基于谷歌的Android系统,早前技术人员使用Eclipse开发软件,后来谷歌宣布停止对搭载Eclipse的开发软件的工具更新,并推出了功能更加强大、使用更加方便的Android Studio1,故本音乐播放软件的开发工具选择Android Studio。Android Studio是谷歌推出的基于IntelliJ IDEA的Android 应用开发集成开发环境,并且赋予了很多提升Android应用的构建效率的功能,如 基于Gradle可以灵活地构建系统、Intant Run可以实时将变更传入到运行中软件中等,当前播放软件的编译版本、环境,如图2.1所示:图2.1 当前软件编译环境2.2软件运行的环境 夜神android模拟器是一款国产手机模拟器,采用类手机界面视觉设计的PC端桌面软件,采用内核技术(基于Android 4.4.2版本内核针在电脑上运行深度开发),具有同类模拟器中领先运行速度和稳定的性能。相对Genymotion它更接近真机,能够安装一些应用市场的手机软件,如果在genymotion安装应用需要安装相应的包,操作繁杂,容易出错。当然夜神模拟器也有不足的地方,即每次启动Android Studio和夜神模拟器,需要在Windows命令界面中做一些操作,如图2.2所示:图2.2 连接夜神模拟器的cmd界面命令3 软件功能的实现3.1 UI布局模块3.1.1五大页面之间的跳转该音乐播放软件有五大页面,分别是 “发现”、“视频”、“我的”、“视频”、“账号”,为了提高代码的可复用性以及可扩展性,创建了五个Fragment,分别对应DiscoveryFragment、VideoFragment、MineFragment、DynamicsFragment、AccountFragment。将这五个Fragment加载入MainActivity中的id为container_content的相对布局中。当点击MainActivity中的导航栏中的某个页面的图标时,container_content会加载相应的Fragment2 。点击切换Fragment的效果的原理是通过FragmentManager调用方法add将五个Frament对象加入id为container_content的RelativeLayout中,当点击导航栏中其中一个图标的时候,FragmentManger调用hide方法隐藏其它四个Fragment,从而显示出导航栏图标对应的Fragment。导航逻辑设计如图3.1所示:图3.1 FragmentManager将Fragment加入Activity一般情况下,Fragment作为Activity界面的一部分,我们可以向一个Activity中添加多个Fragment,也可以想多个Activity添加同一个Fragment,Fragment成功实现了模块化,它具有自己的生命周期和布局文件,但它的生命周期会受到Activity的生命周期的影响。Fragment不能独立存在,必须依赖在Activity之上,并且Fragment中不能嵌套使用Fragment。当Activity被销毁时,Activity中的Fragment随之销毁。而要在Activity中添加、替换、移除Fragment,则需要借助FragmentManager对Fragment的管理。FragmentManager向Activity提交对Fragment的每组更改成为事务(Transition)。你也可以将提交的事务加入返回栈,让用户点击返回键时能够回退到上一个事务。每个事务中调用add()、replace()、remove()、show()、hide()等方法实现Activity对Fragment的管理,并且最后一定要调用commit()方法提交事务。3.1.2“发现”页面-DicoveryFragment的布局DiscoveryFragment 主要组成部分如图3.2所示:图3.2 “发现”页面的主要组成部分1)搜索栏“发现”页头部的搜索栏的中间是圆角搜索框,右边是圆形音乐播放进度条。这两个控件都属于自定义View3,分别是MySearchView、MusicProgressView。搜索栏整体效果如图3.3所示:图3.3 “发现”页面头部的搜索栏在实际开发过程中,基本控件并不能满足我们的功能和UI界面的需求。因此,Android提供了自定义View的方法,步骤如下:1. 在res/values/attrs.xml文件里,声明自定义控件的的属性;2. 创建自定义View的类,名称应与attrs.xml声明的自定义View的名称相同。在构造方法中,获取属性值且设定默认值;3. 在OnMeasure方法中,定义测量自定义搜索框的宽和高方式;4. 在OnDraw方法中,绘制自定义View的图形。Android绘图基础一般会涉及到Canvas、Paint等4。复杂的操作一般不在OnDraw方法中实现,建议另外创建方法或者在方法OnSizeChanged中实现。画布遍及整个控件的宽、高,画布的x、y轴坐标图如图3.4所示:图3.4 画布的坐标轴5. 根据实际功能需求,定义自定义View的成员方法。2)广告栏由控件ViewPager4和底部提示栏组成,底部提示栏的作用是提示ViewPager目前正显示的是ViewPager中的第某个图片。广告栏图整体效果如图3.5所示:图3.5 广告栏在此处的ViewPager实现了四个重要效果:左右切换无限循环、自动切换、切换的动画效果以及底部提示。实现步骤如下:1、左右切换无限循环 ViewPager可以让用左右滑动切换它的当前View。在此处,View是ImageView控件。ViewPager往往需要与适配器PagerAdapter搭配使用,适配器PagerAdapter给ViewPager提供View的相关数据,类似于ListView的Adapter。实现PagerAdapter抽象类,需要重写方法getCount()、instantiateItem()、isViewFromObject()、destroyItem()ViewPager。ViewPager要实现无限循环,则需要关注如何实现ViewPager在第一个View时右滑切换至最后一个View、ViewPager在最后一个View时左滑切换至第一个View。假定ViewPager要显示的View有3个,分别是View A、View B和View C。为了在滑动时UI上给用户一种左右无限循环的感觉,分别在View A前面放一个View C,View C后面放一个View A,作为页面快速切换时的缓冲。当ViewPager显示的是索引为1的View A时,用户左滑至索引为0的View C,随后迅速且无动画效果地切换到索引为4的View A;当ViewPager显示的是索引为3的View C时,用户右滑至索引为4的View A,随后迅速且无动画效果地切换至索引为1的View A。ViewPager的左右切换无限循环的逻辑设计如图3.4所示:图3. 6 ViewPager实现无限循环的原理图为了实现ViewPager无限循环,需要实时获取ViewPager切换View时的信息,则需要给ViewPager设置监听器,即调用方法addOnPageChangeListener,实现OnPageChangeListener抽象类则需要重写方法onPageSelected和方法onPageScrollStateChanged。在方法OnPageSelected中,查看当前position(View的索引值)并且在符合条件时及时更改索引值,从而实现ViewPager的无限循环效果。2、自动切换在此,借助Handler的定时发送信息实现ViewPager每隔1秒能够自动切换View的效果,同时需要在OnPageChangeListener接口中重写方法onPageScrolled、onPageSelected和方法onPageScrollStateChanged。方法onPageScrolled时ViewPager切换过程中调用的方法,在此过程中移除MessageQuee中的Message,这是为了实现每切换完一个View时刚好只接收且处理一个Message。方法onPageSelected是ViewPager切换View后会调用到的,用全局变量p实时获取当前View的索引。方法onPageScrollStateChanged能检测到ViewPager切换View的三种状态:0(end)、1(press)、2(up)。ViewPager切换View完成时会返回0(end),当用手指摁下拖动View的时候会返回1(press),当用户手指从ViewPager松开时会返回2(up)。故为实现ViewPager自动切换View,需要在ViewPager切换View完成时,用Handler定时发送一次消息。在DiscoveryFragment中的方法onActivityCreted第一次调用Handler发送信息,然后,在整个设计体系中Handler会自动循环定时发送消息。3、切换的动画效果为ViewPager切换View时添加添加动画效果,即调用方法setPageTransformer,实现抽象类PageTransformer需要重写PageTranformer对象的方法transformPage。在方法transformPage中,我们要着重关注当我们滑动View的时候,它的位置参数position的变化5,它反映着View的切换时的状态。假设有三个View,分别是View1、View2、View3,逻辑截图如下:图3.7 ViewPager右滑切换View时参数position的变化图3.8 ViewPager左滑切换View时参数position的变化 4、底部提示 在底部提示栏中,第n个小方格为红色代表当前量p来表示当前显示的是第n个View。实现底部提示栏实时更新,需要全局变量p表示当前View的索引。当设置好ViewPager的无限循环和动画效果后,我们将它直接加入DiscoveryFragment中时,会出现UI界面卡顿的效果,并会有UI界面工作繁忙的警告。出现这种情况的原因是ViewPager自动或手动切换View时,描绘ImageView太过频繁,同时加上一些动画效果,导致UI线程工作量太大,从而使UI界面卡顿。解决方法是用Picasso框架加载图片,降低主线程绘制图片的工作量。3) 歌单导航栏由三个NavIconView组成,NavIconView中包含了圆形图标和图标名称。歌单导航栏整体效果如图3.9所示:图3.9 歌单导航栏NavIconView也是自定义View,它的自定义View的步骤如下:1. 在res/values/attrs.xml中声明NavIconView的属性NavIconView的属性:图 标(nav_icon)、图标的圆形背景半径大小(nav_bg_radius)、图标的圆形背景的颜色(nav_bg_color)、图标名称的颜色(nav_name_color)、图标名称(nav_name)、图标名称的文本大小(nav_name_size)、图标与图标名称之间的距离(nav_distance)、图标是否被选中。2. 创建NavIconView类,在构造方法中获取属性值以及设定默认值。3. 在方法onMeasure中,测量NavIconView的宽、高值。在方法measureWidth中,取图标圆形背景的直径和图标名称宽度之间的最大值为NavIconView的宽,取图标圆形背景的直径、图标与图标名称之间的距离和图标名称的文本高的值之和为NavIconView的高。4. 方法onDraw绘制NavIconView,该控件上方是图标,图标有一个圆形背景,可给该背景设定颜色,下方则是图标对应的名称,图标与图标名称的距离可调节。MainActivity布局中的导航栏上的五个页面图标引用的就是NavIconView,当点击某一个图标时,该图标的属性“nav_checked”设为true,其它图标的nav_checked设为false,所以当点击某一图标时它的圆形背景颜色和图标名称颜色会变为红色。导航栏整体效果如图3.10所示:图3.10 导航栏中的NavIconView4) 推荐歌单栏由两个TextView和一个HorizontalScrollView组成,HorizontalScrollView是横向滚动栏,HorizontalView中包含了6个由CoverView和TextView组成的LinearLayout,控件CoverView是自定义控件,它是圆角矩形的图片。推荐歌单栏整体效果如图3.11所示:图3.11 导航栏中的NavIconViewCoverView的自定义View步骤:1. 在res/values/attrs.xml中声明CoverView的属性CoverView的相关属性:歌单封面的图片(cover_icon)、矩形圆角半径(cover_radius)、歌单被播放的次数(cover_play_time)、歌单被选中(cover_tip_checked);2. 创建CoverView类,在构造方法中获取属性值,设定默认值;3. 在方法onMeasure中,获取该控件的宽、高值。此处,方法measureWidth、measureHeight简单地返回200(单位px),即默认给定了控件的宽和高,故在布局文件中调用此控件时需要指明CoverView的宽、高属性值均为“wrap_content” ;4. 方法onDraw绘制CoverView的图样,该控件整体上是圆角矩形,用图片填充整个控件,然后在右上角绘制播放图标以及播放次数(文本)。5) “风格推荐”栏由两个TextView和一个HorizontalScrollView组成,HorizontalScrollView是横向滚动栏,HorizontalView包含了三个ListView,可以横向拖动切换这三个ListView。每个ListView包含3个item,每个item的内容有歌曲封面、歌曲名称、歌手、歌曲信息、播放图标。DiscoveryFragment整体效果如图3.12所示:图3.12 DiscoveryFragment整体效果3.1.3 “视频”页面-VideoFragment的布局VideoFragment 主要有以下部分组成:1) 视频播放区域视频播放区域中有有两种呈现形式:一、在播放过程点击屏幕,会呈现播放/暂停键(ImageView)、可拖动进度条(Seekbar);二、第一次进入“视频”页面时,未播放时页面上的一些信息提示,包含了视频播放总时长提示(一个ImageView和一个TextView)、视频被播放的次数提示(一个ImageView和一个TextView)、播放键图标。视频播放区域整体效果如图3.13所示:图3.13 “视频”页面播放区域初始化界面点击播放/暂停后的效果如图3.14和3.15所示:图3.14 “视频”页面播放区域播放时的界面图3.15 “视频”页面播放区域播放时的界面2) 视频标题栏及视频的发布者基本信息等这部分由视频的标题基本信息(一个TextView)、视频发布者的基本信息(头像和昵称,即一个ImageView和一个TextView)、一个评论图标和一个点赞图标(两个ImageView)组成。整体效果如图3.16所示:图3.16 “视频”页面 视频的相关信息3.1.4 “我的”页面-MineFragment的布局在MineFragment中,大量运用了布局管理器6,将Android基本控件组合在一起形成一个新的控件。MineFragment页面内容主要有以下部分组成:1) 页面头部的功能栏此部分由圆形音乐进度条(MusicProgress,自定义View)、圆形用户头像框(MusicPlayCoverView,自定义View)、用户名(TextView)及四个功能图标(ImageView+TextView)组成。另外,此部分的背景设为一张图片。整体效果如图3.17所示:图3.17 “我的”页面 头部相关信息2) “我的音乐”横向滚动栏此部分由一个标题(TextView)和5个功能模块组成,每个功能模块都是一个指定宽高和背景图的LinarLayout布局里,在该布局里有一个功能图标和一个功能名称(一个ImageView和一个TextvView)。“我的音乐”栏整体效果如图3.18和图3.19所示:图3.18 “我的音乐”栏图3.19 “我的音乐”栏3) “最近播放”横向滚动栏此部分由标题栏(2个TextView)和一个HorizontalScrollView组成,HorizontalScrollView可以横向拖动来切换5个功能模块。每个功能模块是个RelativeLayout布局,功能模块里有个指定图片为背景的子RelativeLayout,此子RelativeLayout里有个ImgeView装在一个“播放”图标,子RelativeLayout右边时一个TextView(功能模块的名称)。“最近播放”栏整体效果如图3.20所示:图3.20 “最近播放”栏4) “创建歌单”栏此部分由标题栏(TextView)和四个功能模块组成。每个功能模块是一个RelativeLayout,其内部有一个ImageView和TexView。“创建歌单”栏整体效果如图3.21所示:图3.21“创建歌单”栏3.1.5 “动态”页面-DynamicsFragment的布局DynamicsFragment 的布局里只有一个ListView,布局框架整体效果如图3.22所示:图3.22 “动态”页面中的ListView在这里我们给了它三个子Item,每个Item由动态发布者头像(ImageView)和昵称(TexView)、动态文本(String)、动态图片(ImageView)、点赞图标(ImageView)和评论图标(ImageView)。item布局效果如图3.23所示:图3.23 “动态”页面中的ListView的item布局“动态”页面整体效果如图3.24所示:图3.24 “动态”页面中的ListView整体效果3.1.6 “账号”页面-AccountFragment的布局AccountFragment 主要有以下部分组成:1) 页面头部功能栏此部分的组成:最上方是一行功能栏,左边是一个功能图标(ImageView),右方是一个圆形进度条(MusicIProgress,自定义View)。随后它的下方是一个圆形的用户头像(MusicPlayCoverView)和用户名(TextView)。最下方也是一行功能栏,包含四个功能模块,每个功能模块是一个功能图标和一个功能名称组成。整体效果如图3.25所示:图3.25 “账号”页面中的头部用户信息及功能栏2) “音乐服务”功能栏此部分的组成:一个标题(TextView)和一个ListView组成。整体效果如图3.26所示:图3.26 “账号”页面中的“音乐服务”功能栏3) “小工具”功能栏此部分的组成:与“音乐服务”功能栏相似,一个标题和一个ListView。“小工具”整体效果如图3.27所示:图3.27 “账号”页面中的“音乐服务”功能栏4) 其它功能栏此部分是一个ListView,其他功能栏整体效果如图3.28所示:图3.28 “账号”页面中的其它功能栏5) “退出登录”按钮按钮整体效果图3.29所示:图3.29 “账号”页面中的“退出登录”按钮3.1.7 “浸入式”状态栏状态栏位于手机顶部,会提示电量、手信号强度等信息。为了优化整体UI界面美观性,提升用户体验感,将状态栏设为透明,使其背景为Activity或者Fragment的页面。首先我们播放软件调用的Theme的样式设为NoActionBar,然后需要在style.xml中设置状态栏透明,其次在根布局中设置 “android:fitsSystemWindows=true”,作用是让整个布局往下移动一个状态栏的距离,避免根布局中的内容出现在状态栏中。“浸入式”状态栏整体效果如图3.30所示:图3.30 “浸入式”状态栏3.2 本地音乐播放模块 3.2.1 功能需求分析与实现分析功能需求分析:1. 获取本地音乐资源;2. 点击“本地音乐”,跳转至“歌单”页面,歌曲信息更新在歌单列表中;3. 点击“歌单”页面开始播放音乐并跳转至“播放控制”页面;4. “歌单页面”UI实时更新:正在播放的歌曲,歌名颜色变红;5. “播放”页面的UI的实时更新:音乐播放进度条、歌曲名称、歌手、封面;6. 音乐播放不受页面跳转影响,当歌曲播放完根据播放模式自动切换下一首。功能实现分析:1. 在MainActivity中的方法onCreate获取指定文件夹;(netease/cloudmusic/Music)中的音乐,将歌曲的信息(歌名、专辑名、歌手、歌曲封面,播放总时长等)存入 songInfos(静态ArrayList),将所有的歌曲路径加载入pathList;2. 点击“本地音乐”跳转至“歌单”页面,设置songInfoFragment(“歌单”页面)的LisView(个单列表)的Adapter数据来源为songInfo;3. 分离歌曲播放与页面(Activity或者Fragment)的生命周期,将MediaPlayer对音乐播放的控制放在Service中实现,第一次点击歌单中某一首歌曲,就开启Service;4. “歌单”页面就收来自Service广播,从而得知当前歌曲的播放索引,“歌单”页面的ListView的Adapter能够及时刷新个单列表的UI;5. “播放控制”页面接收来自“歌单”页面传入的歌曲索引或者获取Service的广播的歌曲索引即当前进度,及时更新“播放控制”页面的UI;6. “播放控制”页面中点击切换播放模式时广播当前播放模式给MainActivity,并将“上一首”、“下一首”、“播放/暂停”广播给Serivice;7. Service接收来自“播放控制”页面的控制信息,并对音乐播放作出相对处理,同时广播音乐的播放进度、当前歌曲索引等;8. MainActivity获取来自Service广播的歌曲播放进度、索引,同时获取来自“播放控制”页面广播的播放模式,当歌曲播放完毕自动切换下一首歌曲功能。本地音乐播放功能实现的逻辑设计如图3.31所示:图3.31 “账号”页面中的功能实现逻辑图3.2.2 获取本地音乐在扫描本地音乐前,我们定义一个歌曲类SongInfo,歌曲封面(imag_song)、歌曲的播放图标(icon_plya,在为一些布局时用得上该成员变量)、歌曲名称(name_song)、歌手(artist_song)、歌曲信息(info_song)、歌曲专辑(album_song)、歌曲路径(album_song)。本作品的mp3素材是从网易云音乐播放软件中下载的,故我们扫描网易云的存放下载音乐的文件夹netease/cloudmusic/Music下的后缀为”.mp3”的文件,将扫描到的文件的为File对象7,然后把File对象的地址信息存放在pathList变量(ArrayList<String>),把歌曲的相关信息初始化SongInfo对象并为存入songInfos(ArrayList<SongInfo>),加载本地音乐操作在MainActivity的onCreate()方法中实现。 3.2.3 在Service中实现MediaPlayer为了让音乐的播放不受Activity、Fragment生命周期影响,我们在Service8中实现MediaPlayer对音乐的播放控制9。接收来自“播放控制”页面(MusicPlayActivity)的广播,根据在Intent10中“action”的值来控制音乐播放,由inten中的“index”来确定当前歌曲索引。 在方法onStartConmand中,获取intent中的“action”,根据action来让MediaPlayer控制音乐播放第index首歌、暂停、播放以及移动到的进度。“action”值为“play”时,MediaPlayer播放索引为index的歌曲;“action”值为“pause”时,MediaPlayer暂停音乐;“action”值为“start”时,MediaPlayer继续播放音乐;“action”值为“move”时,MediaPlayer跳转进度progress。在播放过程中需要实时广播11进度progress、歌曲索引index等。在Service的onCreate()中,开启一个线程,每个0.2s,在MediaPlayer在播放音乐的过程中,循环广播当前的播放进度progress和当前歌曲的索引index等。3.2.4 歌单页面当点击某一首歌时,歌曲名会变红,左边的图标由数字索引变为“喇叭”的图标,然后跳转到播放页面。而为了歌单中实现左边图标发生变化,以及歌名变红,而且在