音乐播放器的设计与实现设计Word格式文档下载.docx
《音乐播放器的设计与实现设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《音乐播放器的设计与实现设计Word格式文档下载.docx(32页珍藏版)》请在冰豆网上搜索。
(2)能够对音乐文件进行有效的管理。
(3)系统应最大限度地实现易维护性和易操作性。
2.软件的可行性研究
(1)经济上的可行性
Android
是Google历经数年和投资数亿美元开发出来的智能手机系统,是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。
随着各大移动终端生产商大力开发和生产基于
的移动智能设备,
Android迅速得到业界和社会的认可,并成为整个产业的热点,基于
平台的各类人才逐渐成为各大企业竞相争夺的焦点。
而且
是一个开放的系统,不管是企业还是个人都可以参与来表达自己的创意和想法。
(2)技术上的可行性
Google发起了围绕Android的组织——开放手机联盟,其英文全称为“OpenHandsetAlliance”。
它采用了软件堆层(softwarestack,又名以软件叠层)的架构,主要分为三部分。
底层Linux内核只提供基本功能;
其他的应用软件则由各公司自行开发,部分程序以Java编写。
(3)操作上的可行性
本系统采用Android框架,可以在eclipse中安装Android开发插件,使用Android模拟器也可以使用任意Android终端。
模拟器和真正的Android手机没有太大区别,人们对手机操作早已熟悉。
(二)系统功能需求分析
1.用例图及用例描述
功能需求定义了开发人员必须实现的软件功能,使得用户能完成他们的任务,从而满足了用户的业务需求。
用户需求文档描述了用户使用产品必须要完成的任务。
针对音乐播放器分别对音乐播放功能进行详细的调研和分析,总结出如用户需求信息,其用例图如图2.1所示。
图2.1播放器用例图
音乐播放器的用例描述如下:
(1)用例名称:
播放
参与者:
用户
目标:
使得用户可以播放在播放列表中选中的歌曲
前置条件:
播放器正在运行
基本事件流:
1.用户单击“播放”按钮
2.播放器将播放列表中的当前的歌曲
(2)用例名称:
暂停
使得用户可以暂停正在播放的歌曲
歌曲正在播放且未停止和暂停
1.用户单击“暂停”按钮
2.播放器将暂停当前的歌曲
(3)用例名称:
上一首/下一首
目标:
使得用户可以听上一首或下一首歌曲
歌曲正在播放或暂停
1.用户单击“上一首或下一首”按钮
2.播放器将播放上一首或下一首歌曲
(4)用例名称:
播放列表
使得用户可以进入播放清单
程序在运行
播放器进入播放列表
(5)用例名称:
歌词显示
使得程序进入播放器歌词设置状态
程序运行在播设定界面
播放器显示或关闭歌词
2.音乐播放器的时序图
播放器对象之间的交互情况如图2.2所示。
图2.2音乐播放器的时序图
(三)业务流程分析
播放器工作流程图如图2.3所示。
图2.3音乐播放器流程图
三、系统设计
(一)总体设计
根据播放器的实现目标,可获得播放器的基本需求,以下从不同角度来描述系统的需求,系统的功能需求,分成三部分来概括,即播放器的基本控制需求,播放列表管理需求和播放器友好性需求,如图3.1所示为应用功能结构图分析:
图3.1功能结构图
(二)歌曲列表模块设计
程序在初始化界面时,从系统数据库获得SD内所有音乐信息,将这些得到的信息构建到列表呈现给用户,流程如图3.2所示:
图3.2歌曲列表模块流程图
(三)播放控制模块设计
播放控制模块是整个设计控制的核心部分,用户只需通过简单的触摸操作就可以实现对歌曲播放的控制,如图3.3所示:
图3.3播放控制模块流程图
(四)播放器设置模块设计
播放器设置包括播放器背景皮肤更换以及播放器定时睡眠,如图3.4所示:
图3.4播放器设置模块流程图
(五)数据库设计
1.数据库及字段属性设计
(1)字段设计(表、图)
file_table主要是保存歌曲名字、类型、路径。
字段说明:
Id歌曲id号fileName歌曲名字filePath歌曲路径sort歌曲类型(表3.1、图3.5)
Android自带一个MediaStore封闭类专门来存储媒体信息,通过UriEXTERNAL_CONTENT_URI来访问SDcard中的歌曲详细信息。
存放媒体信息如TITLE(标题)、ARTIST(艺术家)、ALBUM(专辑)、SIZE(大小)(表3.2、图3.5)
图3.5歌曲列表
图3.6歌曲详细
(2)音乐播放器E-R图
音乐播放器E-R图(图3.6)
图3.7E-R图
2.数据库连接
(1)创建数据库
Android提供了标准的数据库创建方式。
继承SQLiteOpenHelper,实现onCreate和onUpgrade两个方法,有个好处就是便于数据库版本的升级,连接数据库的算法如下:
/**游标***/
privateCursorc=null;
/**建立表的语句**/
privatestaticfinalStringCREATE_TAB="
createtable"
+"
music(_idintegerprimarykeyautoincrement,music_idinteger,clicksinteger,"
+"
latesttext)"
;
/**列名***/
privatestaticfinalStringTAB_NAME="
music"
/**数据库***/
privateSQLiteDatabasedb=null;
/***构造函数**/
publicDBHelper(Contextcontext,Stringname,CursorFactoryfactory,
intversion){
super(context,name,factory,version);
}
/***构造一个数据库,如果没有就创建一个数据库***/
@Override
publicvoidonCreate(SQLiteDatabasedb){
this.db=db;
db.execSQL(CREATE_TAB);
}
(2)操作数据库
Android对数据库的操作主要有插入、删除、更新、查询操作,在进行任何操作时都必须指定一个Uri,才能对相应的表进行数据操作。
/**插入数据**/
publicvoidinsert(ContentValuesvalues){
SQLiteDatabasedb=getWritableDatabase();
db.insert(TAB_NAME,null,values);
db.close();
/***更新数据*/
publicvoidupdate(ContentValuesvalues,intid){
db.update(TAB_NAME,values,"
music_id="
+id,null);
/**删除数据*/
publicvoiddelete(intid){
if(db==null){
db=getWritableDatabase();
}
db.delete(TAB_NAME,"
music_id=?
"
newString[]{String.valueOf(id)});
(3)数据显示
程序是利用Cursor游标类指向数据表中的某一项,然后进行查询数据,用Log日志显示出来
/***查找数据*/
publicCursorquery(intid){
SQLiteDatabasedb=getReadableDatabase();
c=db.query(TAB_NAME,null,"
newString[]{String.valueOf(id)},null,null,null);
returnc;
四、系统实现
(一)主界面
Android的每一个可视化界面,都有其的唯一的布局配置文件,该文件里面有各种布局方式,和各种资源文件如图像,文字,颜色的引用,程序在运行时,可以通过代码对各配置文件进行读取。
这样就可以形成不同的可视化界面和炫丽的效果。
播放器主界面是一个Activity,Android工程在每个activity启动的时候会首先执行Oncreate()方法,如下代码:
PublicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
);
该方法主要执行界面的初始化操作,Activity有个设置布局的方法:
Context.setContentView(layoutResID),参数为资源ID,该Id在工程目录res/layout下,主界面布局文件名为main。
欢迎界面结束以后进入主界面图4.1所示,主界面主要采用相对布局(RelativeLayout)。
图4.1主界面
部分布局代码如下:
<
RelativeLayout
android:
id="
@+id/rl_player_topbar"
layout_width="
fill_parent"
layout_height="
50dp"
layout_alignParentTop="
true"
background="
@drawable/bg_media_library_topbar"
>
<
ImageButton
@+id/ibtn_player_list"
wrap_content"
layout_alignParentLeft="
layout_margin="
5dp"
@drawable/player_btn_list"
/>
TextView
@+id/tv_player_song_info"
layout_centerHorizontal="
layout_toLeftOf="
@+id/ibtn_player_voice"
layout_toRightOf="
@id/ibtn_player_list"
ellipsize="
marquee"
focusable="
focusableInTouchMode="
gravity="
center_horizontal"
lines="
1"
marqueeRepeatLimit="
marquee_forever"
singleLine="
android:
text="
显示歌名"
textColor="
@android:
color/white"
textSize="
19sp"
textStyle="
bold"
@+id/tv_player_singer_info"
layout_below="
@id/tv_player_song_info"
paddingLeft="
71dip"
显示歌手"
15sp"
layout_alignParentRight="
@drawable/player_btn_voice"
/RelativeLayout>
1.播放音轨SeekBar
在main.xml文件中,SeekBar的代码如下:
SeekBar
@+id/sb_player_voice"
layout_centerVertical="
@id/iv_player_max_voice"
@id/iv_player_min_voice"
@drawable/voice_seekbar_bg"
paddingRight="
progressDrawable="
@drawable/voice_seekbar_progress"
thumb="
@drawable/voice_seekbar_thumb"
上面代码中有参数android:
@drawable/voice_seekbar_thumb"
为音轨游标的图片资源android:
@drawable/voice_seekbar_progress"
为SeekBar条的风格style。
引用了drawable中的voice_seekbar_progress.xml文件,voice_seekbar_progress.xml是自定义的配置文件,代码如下:
?
xmlversion="
1.0"
encoding="
utf-8"
>
layer-listxmlns:
android=>
<
itemandroid:
id/background"
android:
drawable="
<
/item>
id/progress"
clipandroid:
@drawable/voice_seekbar_one"
/layer-list>
播放器最重要的一部分就是音轨与歌曲进度同步的实现。
音轨设置了两个TextView用来显示当前歌曲播放的进度时间和歌曲的长度(图4.2)。
图4.2播放音轨
音轨对象SeekBar部分代码如下:
privatevoidShowSeekBar(){
seekbar.setOnSeekBarChangeListener(newOnSeekBarChangeListener(){
@Override
publicvoidonStopTrackingTouch(SeekBarseekBar){
}
publicvoidonStartTrackingTouch(SeekBarseekBar){
publicvoidonProgressChanged(SeekBarseekBar,intprogress,
booleanfromUser){
if(fromUser){
seekbar_change(progress);
}elseif(seekBar.getId()==R.id.sb_player_voice){
//设置音量
am.setStreamVolume(AudioManager.STREAM_MUSIC,
progress,0);
}
});
/**
*进度条改变事件
*/
privatevoidseekbar_change(intprogress){
Intentintent=newIntent();
intent.setAction();
intent.putExtra("
op"
PROGRESS_CHANGE);
progress"
progress);
startService(intent);
2.播放调节功能实现
各按钮水平放置,从左到右依次是上一首、播放、下一首功能按钮。
用的是布局中的线性布局LinearLayout,;
将其设置为水平,如图4.3所示:
图4.3播放功能按钮
LinearLayout中依次放置播放/暂停,上一首、下一首按钮属性。
配置文件代码结构如下:
LinearLayout
@id/ibtn_player_control_mode"
@id/ibtn_player_control_menu"
center"
orientation="
horizontal"
@+id/ibtn_player_control_pre"
75dip"
58dip"
@drawable/player_btn_player_pre"
/>
@+id/ibtn_player_control_play"
android