音乐播放器Word下载.docx
《音乐播放器Word下载.docx》由会员分享,可在线阅读,更多相关《音乐播放器Word下载.docx(30页珍藏版)》请在冰点文库上搜索。
(1)软件采用人机交互的方式,界面美观友好,操作灵活、方便、富有个性化。
(2)能够对音乐文件进行有效的管理。
(3)系统应最大限度地实现易维护性和易操作性。
2.2功能需求
功能需求定义了开发人员必须实现的软件功能,使得用户能完成他们的任务,从而满足了用户的业务需求。
用户需求文档描述了用户使用产品必须要完成的任务。
针对音乐播放器分别对音乐播放、在线音乐播放及会员特权的换肤等功能进行详细的调研和分析,总结出如下的用户需求信息。
2.2.1功能需求(时序图)分析和结构图
从时序图中可以看出播放器中信息发送和调用过程
主界面
播放列表
播放界面
点击进入按钮
选择歌曲播放
进入播放列表
播放
后台service
Servic
播放页面
发送参数,调用后台service
播放,返回播放界面
2.2.2系统功能表和结构图
功能类别
子功能
播放列表菜单
退出播放
从扩展卡寻找歌曲
歌曲菜单
播放->
进入播放界面
删除->
数据库同步更新
重命名->
向上、下移动->
播放歌曲->
线程启动->
时间更新
暂停
暂停歌曲->
线程暂停->
时间暂停
停止
停止歌曲->
线程停止->
时间停止
上一首
播放列表索引变化->
寻找上一ID歌曲
下一首
寻找下一ID歌曲
播放界面菜单
返回到播放列表
返回到主菜单
退出播放器
隐藏播放界面
主菜单
退出程序
程序退出
显示播放列表
.主界面
是否显示全
部音乐
是否点击要播放的歌曲
音乐播放
程序结束
图2.2.3结构图
第三章总体设计
该音乐播放器的总目标是,实现内存卡内音乐的读取、对音乐播放的基本操作、实现歌词的同步功能、用户友好性操作的实现等,在实现这些功能的基础上要考虑到音乐播放器的UI界面的设计的友好性易操作。
3.1设计原则
系统设计是一个把软件需求转换成用软件系统表示的过程。
通过对目标系统的分析和研究,做出对音乐播放器的整体规划,这是全面开发系统的重要基础。
下面介绍系统功能结构图和流程图。
3.1.1总体设计路线
在Android的开发中界面的设计是很重要的,因为它区别于web的开发。
它的界面小,又要在这么小的界面上竟可能多的去实现功能,所以在UI设计上,组件的摆放问题以及屏幕之间滑动跳转问题都要都是在设计工程中中要考虑到的,其次,Android程序主要应用在手持设备上,不论用户是单手操作还是双手操作,都必须考虑到组件摆放的易操作性,所以要考虑到组件摆放的区域问题,除此之外在UI设计的编写上也要考虑到代码的可更改问题,如果单纯的用XML文件实现,那么在软件的进一步更改开发上可能会遇到很大问题,所以该系统的大部分界面都是通过xml和Java代码共同实现的。
在完成音乐播放器界面的设计后就是功能模块的具体设计了,功能这一块是根具需求来的,有怎么样的需求就对应怎样的功能设计,该音乐播放器所要实现的功能都是通过各个类之间的调用实现的,这样就增加了代码的可读性,对于音乐播放器来说最主要的还是实现音乐播放功能,第一部分就是音乐文件读取、音频文件信息的读取,其次是对音乐的操作,然后就是播放器的个性化设置。
所以要做好也是一件不简单的事情。
3.1.2系统功能结构图
系统主要分为四大模块,歌曲列表模块、歌曲播放模块、专辑列表模块、菜单设置模块,根据设四个模块的命名就可以知道这四个模块的基本功能了,歌曲列表模块就是在程序启动的时候自动扫描并获取添加歌曲到歌曲列表中,然后用户可以对列表内的歌曲进行一些操作,歌曲播放模块不仅要显示正在播放的歌曲信息而且要实现对歌曲的一些基本操作,在播放界面实现了一个类似android的Luncher划屏查看歌词的功能,还有是实现了歌曲图片的一个倒影效果显示,专辑列表模块主要考虑到内存歌曲过多时为方便用户找到自己喜欢的歌手而设置的一个网格列表,当你选种歌曲时它可以对歌曲就行播放。
菜单设置模块呢,主要实现对音乐播放器的个性化设置,满足用户除了听歌曲以外的需求,主要有三个子功能,退出程序、睡眠模式设置、日夜模式设置,在日夜模式设置这块主要就是改变屏幕的明暗度,获取当前系统设置的明暗度,然后对其做改变。
音乐播放器的系统功能结构图(如图3.1所示)
图3.1系统功能结构图
3.1.3系统流程图
音乐播放流程图(如图3.2所示)
图3.2音乐播放流程图
3.2主要功能设计(功能模块介绍)
3.2.1歌曲列表模块
用户启动播放器后进入的界面是歌曲列表界面,歌曲列表主要是自动读取手机内存里的歌曲信息,其中显示的有歌曲图片、歌曲名、演唱者、歌曲总时长,用户通过浏览歌曲列表可以对歌曲进行一些操作,其功能序列图如图3.3所示。
该功能模块实现了以下几个子功能:
a.歌曲的播放
b.手机铃声设置
c.查看歌曲详细信息
图3.3歌曲列表操作序列图
3.2.2音乐播放模块
用户选中要播放的歌曲后跳转到音乐播放界面,音乐播放界面主要显示的有歌曲的信息,以及对音乐操作的按钮,播放、暂停、上一曲、下一
曲、音乐进度条等,用户还可以通过划屏查看歌曲的同步歌词,其功能序列图如图3.4所示。
图3.4歌曲列表操作序列图
3.2.3专辑列表模块
用户点击专辑列表按钮后可以查看内存里所有的歌曲所属专辑,专辑列表主要显示专辑及专辑名、歌手名,选中要播放专辑后点击可以直接跳转到播放界面,对专辑内的歌曲可以进行播放的基本操作。
如图3.5所示。
图3.5专辑列表操作序列图
3.2.4菜单设置模块
菜单里主要是对播放器的设置,以满足用户的个性化需求,但考虑到本系统以简单易操作的前提下,所以用户的个性化设置不易太多。
其功能序列图如图3.5所示。
该功能模块实现了一下几个子功能。
a.退出播放器
b.休眠模式设置
c.日/夜模式设置
d.关于播放器
图3.6菜单设置操作序列图
3.3系统的安全设计
安全性是软件系统永恒的主题,其紧迫程度与功能的可拓展性成正比。
越是可以灵活拓展的系统,越是需要一种强大的安全控制机制。
世界上最安全的系统,就是一坨废铁,因为永远不可能有新功能加入,于是绝对安全。
如果我们可以在其上编写程序,则需要提供一定程度的安全控制,这时程序有好有坏,也有可能出错。
如果我们的软件,会通过互联网这样的渠道可以获得,则这种安全上需求会更强烈,因为各种各样的邪恶用意都有可能存在。
大体上说,安全性控制会有四种需求:
(1)应用程序绝对不能对系统造成破坏。
作为一个系统,它的首要目标当然是共享给运行于其上的应用程序以各种系统级的功能。
但如果这些应用程序,如果可以通过某种渠道对这个共享的系统造成破坏,这样的系统去运行程序就没有意义,因为这时系统过于脆弱。
(2)应用程序之间,最好不能互相干扰。
如果我们的应用程序,互相之间可以破坏对方的数据,则也不会有很好的可用性,因为这时单个的应用程序也还是脆弱的。
(3)应用程序与系统,应用程序之间,应该提供共享的能力。
在安全性机制下,我们也还是需要提供手段,让应用程序与系统层之间、应用程序之间可以交互。
(4)还需要权限控制。
我们可以通过权限来保护系统,一些非法的代码在没有权限的情况就无法造成破坏。
在给不同应用程序提供系统层功能、提供共享时,应用程序有权限才能执行,没有权限则会拒绝应用程序的访问。
在本项目的开发过程中就遇到了应用程序与系统之间的问题,运行程序之后就使整个系统字库奔溃,同时还遇了权限问题,在Android中你想实现什么样的功能就必须给项目赋予什么样的权限,在本项目中需要给项目提供SD卡读写的权限,所以在编写程序的第一步就要考虑到权限问题,不然后面的工作都没法进行。
第四章播放器系统功能详细设计
4.1音乐播放器主界面功能实现
4.1.1播放器主界面
播放器主界面(图4.1)
图4.1
Android的每一个可视化界面,都有其的唯一的布局配置文件,该文件里面有各种布局方式,和各种资源文件如图像,文字,颜色的引用,程序在运行时,可以通过代码对各配置文件进行读取。
这样就可以形成不同的可视化界面和炫丽的效果。
播放器主界面是一个Activity,Android工程在每个activity启动的时候会首先执行Oncreate()方法,如下代码:
@Override
PublicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.play_rack);
}
该方法主要执行界面的初始化操作,Activity有个设置布局的方法:
Context.setContentView(layoutResID),参数为资源ID,该Id在工程目录res/layout下,主界面布局文件名为play_rack。
下面为play_rack.xml布局文件代码结构如下:
<
?
xmlversion="
1.0"
encoding="
utf-8"
>
AbsoluteLayout>
<
LinearLayout>
/LinearLayout>
SeekBar>
/SeekBar>
LinearLayout>
/AbsoluteLayout>
在绝对布局<
下嵌套两种线性布局<
和<
,第一个<
实现了标题和歌曲名的显示位置,通过<
布局设置<
绝对坐标来控制标题的位置。
每个布局内可以放置多种Widget(窗体部件)例如:
TextView>
ImageButton>
等。
每个Widget内有多种属性,可以设置该Widget的坐标,大小,背景和颜色等参数。
在播放界面中,歌词显示为居中,实现方法代码如下:
LinearLayoutandroid:
orientation="
horizontal"
android:
gravity="
center"
layout_height="
wrap_content"
android:
layout_width="
fill_parent"
<
TextViewandroid:
android:
textColor="
#8deeee"
android:
id="
@+id/lrcText"
/TextView>
属性:
:
此线性布局的子部件为水平方式布局 Layout_width="
fill_content"
:
布局的宽度为填满父布局
Layout_height="
布局的高度子由窗体的大小决定
窗体TextView文本:
8deeee"
设置文本显示的颜色RGB为"
TextSize为默认大小
4.1.2播放界面音轨的实现
播放器音轨SeekBar(如下图)
Android系统自带SeekBar(如下图)
图4.2
不管是从界面外观还是从功能上,系统自带的SeekBar往往不能满足用户的需要。
所以我在这里自定义了一个音轨SeekBar,
在play_rack.Xml配置文件中,SeekBar的代码如下:
SeekBarandroid:
@+id/seekbar"
245px"
android:
20px"
layout_x="
40px"
layout_y="
260px"
android:
progressDrawable="
@drawable/seekbar_style"
thumb="
@drawable/thumb"
paddingLeft="
18px"
paddingRight="
15px"
paddingTop="
5px"
paddingBottom="
progress="
0"
max="
100"
secondaryProgress="
上面代码中有参数android:
为音轨游标的图片资源android:
为SeekBar条的风格style。
引用了drawable中的seekbay_style.xml文件,seekbay_style.Xml是自定义的配置文件,算法如下:
layer-listxmlns:
android="
itemandroid:
@android:
id/background"
shape>
cornersandroid:
radius="
5dip"
/>
gradientandroid:
startColor="
#ff9d9e9d"
centerColor="
#ff5a5d5a"
centerY="
0.75"
endColor="
#ff747674"
angle="
270"
/shape>
/item>
id/secondaryProgress"
clip>
#80ffd300"
#80ffb600"
#a0ffcb00"
/clip>
id/progress"
#ff0099CC"
#ff3399CC"
#ff6699CC"
/layer-list>
配置文件中三个Item项依次决定了SeekBar的三层背景,从最下层的灰色到最上层的蓝色。
通过各种属性设置了SeekBar的倾斜度,两端圆半径,角度,中心位置,起始,中心和结束的颜色,游标的起始位置。
通过这些属性设置,就自定义一个如上图一的SeekBar音轨.
播放器最重要的一部分就是音轨与歌曲进度同步的实现。
音轨设置了两个TextView用来显示当前歌曲播放的进度时间和歌曲的长度(图5.3)
图4.3
音轨对象SeekBar在歌曲刚开始播放的时候调用方法SeekBar.setMax(),参数传入歌曲的长度。
SeekBar.setProgress
(1)设置游标的起始进度为1。
然后程序运行如下代码:
privateRunnablethread_One=newRunnable(){//线程
publicvoidrun(){
intcurrently_Progress=seekBar.getProgress()+1000;
seekBar.setProgress(currently_Progress);
currently_Time.setText(getFileTime(mplayer.getCurrentPosition()));
showLrcTwo(lrc_time,lrc_word);
handler.postDelayed(thread_One,1000);
}};
Android的线程的开始是通过Handler类来进行的,Handler类是线程与线程之间通信的桥梁,实现Runnable接口会实现里面的run方法,当线程开始的时候,Runnable中的run方法会向Handler发一个Message消息,这样,Handler类就可以接收到run方法发送过来的不同的消息进行不同的代码处理。
这样就达到了各线程之间的通信。
要启动一个线程调用Handler的方法postDelayed(Runnable,1000)表示线程睡眠时间是1000ms。
以上代码意思是让播放歌曲的线程每隔1000ms,即每1秒对音轨的TextView重新设置时间且让进度条前进1秒的进度。
对音轨进行刷新。
这样就实现了歌词同步功能SeekBar有一个监听器,该监听器的作用是一直保持着对进度条的监听,当我们用鼠标向SeekBar的各位置进行点击时,它会自动监听其位置,进行相应的位置显示。
这也是进度条上的游标会不停的移动和歌词时间会不停的变动的原因。
4.1.3播放器播放、暂停、停止等功能
图4.4
如图5.4所示:
各按钮水平放置,用的是布局中的线性布局LinearLayout,用方法setOrientation(horizontal);
将其设置为水平。
LinearLayout中依次放置播放,暂停,停止,上、下一曲按钮属性。
配置文件代码结构如下:
ImageButton>
/ImageButton>
android的媒体播放原理:
android源程序已经为我们封装好了一个接口类,叫MediaPlayer。
该接口在执行行需要一个数据源,通过如下四个步骤:
第一步:
MediaPlayer.reset();
复位操作,为以后的媒体准备播放作准备。
第二步:
传入歌曲数据源,这里也是一个数据流MediaPlayer.setDataSource(Stringpath);
参数需要传一个路径,该接口类在收到路径后将其转化为数据源。
第三步:
准备播放数据源,调用方法MediaPlayer.Prepare();
第四步:
MediaPlayer.Start();
播放数据源,该数据源播放后,不再与程序有关,需要用MediaPlayer.Stop()方法让其停止或MediaPlayer.Start();
让其启动;
歌曲数据源的获得:
要获得数据源,需要我们提供给接口类一个歌曲存放路径,而这个路径已经被事先放到数据库里了,我们只需要进行数据库进行操作。
将里面的路径取出。
这里将调用PlayRackActivity的一个方法query();
代码算法如下:
publicStringquery(){
ContentResolvercr=getContentResolver();
Uriuri=DBProvider.CONTENT_URI;
String[]projection={"
path"
};
Stringselection="
fileName=?
"
;
String[]selectionArgs={s