Android在线音乐播放器设计文档.docx
- 文档编号:25799076
- 上传时间:2023-06-14
- 格式:DOCX
- 页数:22
- 大小:636.90KB
Android在线音乐播放器设计文档.docx
《Android在线音乐播放器设计文档.docx》由会员分享,可在线阅读,更多相关《Android在线音乐播放器设计文档.docx(22页珍藏版)》请在冰豆网上搜索。
Android在线音乐播放器设计文档
目录
1.android开发介绍1
1.1Android平台架构1
1.21.2.ApplicationFramework(应用程序框架)1
1.3Libraries(库)2
1.4AndroidRuntime(Android运行时)2
1.5LinuxKernel(linux内核)2
1.6Android的四大组件2
1.6.1Activity2
1.6.2Service2
1.6.3BroadcastReceiver3
1.6.4ContentProvider3
2需求分析4
2.1播放器的设计目标4
2.2软件的可行性研究4
2.2.1经济上的可行性4
2.2.2技术上的可行性5
2.3播放器的功能性需求5
2.3.1播放器的基本功能5
33总体设计6
3.1主要界面设计6
3.2列表界面实现思路7
3.2.1Sqlite数据库7
3.2.2从数据库加载歌曲信息7
3.3播放设计8
3.4歌词处理设计11
3.4.1在线获取歌词11
3.4.2歌词处理12
3.4.3使用歌词12
4详细设计与实现13
4.1歌曲显示界面14
4.2歌曲播放界面16
4.2.1播放音轨SeekBar16
4.2.2播放调节功能实现17
4.3控制播放的service18
4.4歌词显示18
5结 语20
1.android开发介绍
Android平台架构
Android平台主要包括Applications、ApplicationFramework、Libraries、AndroidRuntime和LinuxKernel几部分,如图1.1所示。
Android提供了一组应用程序,包括Email酷虎段、SMS程序、日历、地图、浏览器、通讯录等。
这部分程序均使用Java用语言编写。
图1.1Android平台架构
1.2ApplicationFramework(应用程序框架)
无论是Android提供的应用程序还是开发人员自己编写的应用程序,都需要使用ApplicationFramework(应用程序框架)。
通过使用ApplicationFramework,不仅可以大幅度简化代码的编写,而且可以提高程序的复用性。
Libraries(库)
Android提供了一组C/C++库,他们为平台的不同组件所使用。
开发人员通过ApplicationFramework来使用这些库所提供的不同功能。
AndroidRuntime(Android运行时)
Android运行时包括核心库和Dalvik虚拟机两部分。
核心库中提供了Java语言核心库中包含的大部分功能,虚拟机负责运行程序。
Dalvik虚拟机专门针对移动设备进行编写,不仅效率更高,而且占用更少的内存。
LinuxKernel(linux内核)
Android平台使用Linux2.6版内核提供的核心系统服务,包括安全性、内存管理、进程管理等。
Android的四大组件
Android四大基本组件分别是Activity,Service服务,ContentProvider内容提供者,BroadcastReceiver广播接收器。
Activity
从字面上理解,Activity是活动的意思。
一个Activity通常展现为一个可视化的用户界面,是Android程序与用户交互的窗口,也是Android组件中最基本也是最复杂的一个组件。
从视觉效果来看,一个Activity占据当前的窗口,响应所有窗口事件,具备有控件,菜单等界面元素。
从内部逻辑来看,Activity需要为了保持各个界面状态,需要做很多持久化的事情,还需要妥善管理生命周期,和一些转跳逻辑。
对于开发者而言,需要派生一个Activity的子类,进而进行编码实现各种功能方法。
Service
服务是运行在后台的一个组件,从某从意义上说,服务就像一个没有界面的Activity。
它们在很多Android的概念方面比较接近,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事件,定义好需要接受的Intent提供同步和异步的接口。
Android中得服务其实与windows中得服务类似,它执行长时间运行的操作,或运程进程执行工作。
服务不提供用户界面,例如在后台下载东西,播放音乐,在你播放音乐的同时还可以干其他事情,而不会阻塞用于与其他活动的交互。
另一个组件,比如Activity可以启动一个服务,并运行或者绑定到它。
BroadcastReceiver
广播接收者,不执行任何任务,广播是一种广泛运用的在应用程序之间传输信息的机制。
而BroadcastReceiver是对发送出来的广播进行过滤接收并响应的一类组件。
BroadcastReceiver不包含任何用户界面。
然而它们可以启动一个Activity以响应接受到的信息,或者通过NotificationManager通知用户。
可以通过多种方式使用户知道有新的通知产生:
闪动背景灯、震动设备、发出声音等等。
通常程序会在状态栏上放置一个持久的图标,用户可以打开这个图标并读取通知信息。
在Android中还有一个很重要的概念就是Intent,如果说Intent是一个对动作和行为的抽象描述,负责组件之间程序之间进行消息传递。
那么BroadcastReceiver组件就提供了一种把Intent作为一个消息广播出去,由所有对其感兴趣的程序对其作出反应的机制。
ContentProvider
即内容提供者,作为应用程序之间唯一的共享数据的途径,ContentProvider主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。
Android有一个独特之处就是,在Android中,每个应用程序都是用自己的用户ID并在自己的进程中运行。
这样的好处是,可以有效地保护系统及应用程序,避免被其他不正常应用程序所影响,每个进程都拥有独立的进程地址空间和虚拟空间。
Android的数据(包括files,database等…)都是属于应用程序自身,其他的应用是不能访问到的,更无法直接进行操作。
所以如果你想实现不同应用之间的数据共享,就不得不用contentprovider了。
为了使其他程序能够操作数据,在Android中,可以通过做成ContentProvider提供数据操作的接口。
其实对应用而言,也可以将底层数据封装成ContentProvider,这样可以有效的屏蔽底层操作的细节,并且使程序保持良好的扩展性和开放性。
Android提供了一些主要数据类型的Contentprovider,比如音频、视频、图片和私人通讯录等。
可在android.provider包下面找到一些android提供的Contentprovider。
可以获得这些Contentprovider,查询它们包含的数据,当然前提是已获得适当的读取权限。
如果我们想公开自己应用程序的数据,可以创建自己的Contentprovider。
1需求分析
软件需求分析是软件生存期中重要的一步,也是决定性的一步。
需求分析是软件定义时期的最后一个阶段,它的基本任务是准确地回答“系统必须做什么”这个问题,深入描述软件的功能和性能的需求[9]。
在这一节中主要就是围绕“Android开发平台的音乐播放器系统必须做什么”这个问题来分析说明的。
播放器的设计目标
本系统属于用户常用的音乐播放器。
可以方便用户平时对音乐文件的操作。
本系统应达到以下目标:
(1)软件采用人机交互的方式,界面美观友好。
(2)操作灵活、方便、易上手。
(3)能够对音乐文件进行有效的管理。
(4)满足用户对播放器的个性化设置。
(5)系统应最大限度地实现易维护性和易操作性。
软件的可行性研究
经济上的可行性
Android 是Google历经数年和投资数亿美元开发出来的智能手机系统,是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。
随着各大移动终端生产商大力开发和生产基于 Android 的移动智能设备, Android迅速得到业界和社会的认可,并成为整个产业的热点,基于 Android 平台的各类人才逐渐成为各大企业竞相争夺的焦点。
而且 Android 是一个开放的系统,不管是企业还是个人都可以参与来表达自己的创意和想法。
技术上的可行性
Google发起了围绕 Android 的组织——开放手机联盟,其英文全称为“OpenHandsetAlliance”。
它采用了软件堆层(softwarestack,又名以软件叠层)的架构,主要分为三部分。
底层Linux内核只提供基本功能;其他的应用软件则由各公司自行开发,部分程序以Java编写。
2.2.3操作上的可行性
本系统采用Android框架,可以在eclipse中安装Android开发插件,使用Android模拟器也可以使用任意Android终端。
模拟器和真正的Android手机没有太大区别,人们对手机操作早已熟悉。
播放器的功能性需求
根据项目的目标,我们可获得项目系统的基本需求,以下从不同角度来描述系统的需求,并且使用用例图来描述系统的功能需求,播放器的基本控制需求。
2.3.1播放器的基本功能
在播放器运行时,首先进入的是欢迎界面,点击进入后进入主界面,主界面是扫描SD卡里的本地歌曲列表,对列表里的歌曲可进行播放、点击播放列表中的歌曲名可以跳转到播放界面,在播放界面可以控制歌曲的播放、暂停、上一首、下一首、进入播放列表、进入专辑列表、查看歌词、拖动歌曲进度等,在主界面中还可以通过点击手机的菜单键弹出手机的个性化设置对话框,对手机进行睡眠模式设置、日/夜模式、查看软件关于信息、退出程序的操作。
其用例图如图2.1所示。
图2.1播放器用例图
23总体设计
该音乐播放器的总目标是,实现内存卡内音乐的读取、对音乐播放的基本操作、实现歌词的同步功能、用户友好性操作的实现等,在实现这些功能的基础上要考虑到音乐播放器的UI界面的设计的友好性易操作。
主要界面设计
1)用lisview实现显示歌曲列表,艺术家,专辑图片,歌曲名,播放时长等封装。
2)给item添加点击事件,触发显示播放歌曲界面。
3)有时间添加右击菜单,更换皮肤,设置铃声等功能
列表界面实现思路
Sqlite数据库
比较好的实现思路就是,自己维护一个SQLite数据库,然后音乐信息都从sd卡上扫描,好处有很多,但是这样做的话代码量会比较大,写了一段扫描sd卡的代码,然后发现扫描音乐的速度简直慢的惊人,可能自己的目录太多,太深,目前还没想到一个比较好的算法去快速扫描sd卡。
从数据库中查询所有音乐数据,保存到List集合当中,List当中存放的是Mp3Info对象迭代List集合,把每一个Mp3Info对象的所有属性,保存到Map对象当中定义一个List集合,把Map对象添加到List集合当中通过定义一个SimpleAdpter,调用setAdpter方法,将数据显示到列表当中。
从数据库加载歌曲信息
Android已经为用户提供好了一个存放歌曲相关信息的数据库,已经存在这个数据库,我们就直接从里面获取,android系统通过ContextProvider把这个暴露出来,我们只需要获得一个ContextResolver对象去获得歌曲信息。
主要的方法:
Cursorandroid.content.ContentResolver.query(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)
上面参数的主要意思是:
uri通用资源访问符,在这里MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
projection返回信息的行,用一个数组去设置要返回哪些行的信息
selection筛选条件
selectionArgs筛选条件的参数
sortOrder排序的顺序这个用默认的就好了MediaStore.Audio.Media.DEFAULT_SORT_ORDER
主要实现步骤:
1 从数据库中查询所有音乐数据,保存到List集合当中,List当中存放的是Mp3Info对象。
2 迭代List集合,把每一个Mp3Info对象的所有属性,保存到Map对象当中。
3 定义一个List集合,把Map对象添加到List集合当中通过定义一个SimpleAdpter,调用setAdpter方法,将数据显示到列表当中。
播放设计
音乐是通过Service来播放的,Activity通过启动服务来实现在后台播放音乐。
Activity中自定义了一个广播接收器,需要进行intent过滤器的定义,动作的添加,注册广播接收器:
首先 创建IntentFilter 然后指定BroadcastReceiver监听的Action 最后注册BroadcastReceiver 。
在广播接收器类当中对动作进行处理,比如实现时间的更新和标题的更新等。
这里还要注意按钮触发,播放状态的改变,比如音乐循环,有三种状态:
单曲、全部循环、顺序,每切换一个状态都要向服务发送一条广播,通知它要改变状态。
点击列表的时候,会跳入到播放界面的Activity中,要注意用intent来传递参数,注意每个参数的用途,比如title、url、MSG,就分别代表标题、路径、播放状态。
播放音乐要注意以下三点:
1 播放状态(上一首、下一首、暂停音乐、播放音乐、重复播放、随机播放)
2 进度更新(自定义Seekbar,Seekbar触发时间控制音乐播放的位置)
3 接收来自Service的广播,对播放时间,歌曲信息的UI更新
上图是android开发帮助文档关于media开发的流程图,下面是他的生命周期:
首先来看看MediaPlayer的生命周期:
Idle 状态:
当使用new()方法创建一个MediaPlayer对象或者调用了其reset()方法时,该MediaPlayer对象处于idle状态。
这两种方法的一个重要差别就是:
如果在这个状态下调用了getDuration()等方法(相当于调用时机不正确),通过reset()方法进入idle状态的话会触发OnErrorListener.onError(),并且MediaPlayer会进入Error状态;如果是新创建的MediaPlayer对象,则并不会触发onError(),也不会进入Error状态。
End 状态:
通过release()方法可以进入End状态,只要MediaPlayer对象不再被使用,就应当尽快将其通过release()方法释放掉,以释放相关的软硬件组件资源,这其中有些资源是只有一份的(相当于临界资源)。
如果MediaPlayer对象进入了End状态,则不会在进入任何其他状态了。
Initialized 状态:
这个状态比较简单,MediaPlayer调用setDataSource()方法就进入Initialized状态,表示此时要播放的文件已经设置好了。
Prepared 状态:
初始化完成之后还需要通过调用prepare()或prepareAsync()方法,这两个方法一个是同步的一个是异步的,只有进入Prepared状态,才表明MediaPlayer到目前为止都没有错误,可以进行文件播放。
Preparing 状态:
这个状态比较好理解,主要是和prepareAsync()配合,如果异步准备完成,会触发OnPreparedListener.onPrepared(),进而进入Prepared状态。
Started 状态:
显然,MediaPlayer一旦准备好,就可以调用start()方法,这样MediaPlayer就处于Started状态,这表明MediaPlayer正在播放文件过程中。
可以使用isPlaying()测试MediaPlayer是否处于了Started状态。
如果播放完毕,而又设置了循环播放,则MediaPlayer仍然会处于Started状态,类似的,如果在该状态下MediaPlayer调用了seekTo()或者start()方法均可以让MediaPlayer停留在Started状态。
Paused 状态:
Started状态下MediaPlayer调用pause()方法可以暂停MediaPlayer,从而进入Paused状态,MediaPlayer暂停后再次调用start()则可以继续MediaPlayer的播放,转到Started状态,暂停状态时可以调用seekTo()方法,这是不会改变状态的。
Stop 状态:
Started或者Paused状态下均可调用stop()停止MediaPlayer,而处于Stop状态的MediaPlayer要想重新播放,需要通过prepareAsync()和prepare()回到先前的Prepared状态重新开始才可以。
PlaybackCompleted状态:
文件正常播放完毕,而又没有设置循环播放的话就进入该状态,并会触发OnCompletionListener的onCompletion()方法。
此时可以调用start()方法重新从头播放文件,也可以stop()停止MediaPlayer,或者也可以seekTo()来重新定位播放位置。
Error状态:
如果由于某种原因MediaPlayer出现了错误,会触发OnErrorListener.onError()事件,此时MediaPlayer即进入Error状态,及时捕捉并妥善处理这些错误是很重要的,可以帮助我们及时释放相关的软硬件资源,也可以改善用户体验。
通过setOnErrorListener(android.media.MediaPlayer.OnErrorListener)可以设置该监听器。
如果MediaPlayer进入了Error状态,可以通过调用reset()来恢复,使得MediaPlayer重新返回到Idle状态。
歌词处理设计
在线获取歌词
在实现这个功能的时候,可以尝试过baiduapi,歌词迷api,这边以歌词迷api为例。
歌词迷api歌词查询地址:
http:
//geci.me/api/lyric/比如我要查询:
http:
//geci.me/api/lyric/甜甜的/周杰伦,会得到一下json串:
{"count":
2,"code":
0,"result":
[{"aid":
3032192,"artist_id":
30796,"song":
"\u751c\u751c\u7684","lrc":
"http:
//s.geci.me/lrc/369/36909/3690908.lrc","sid":
3690908},{"aid":
3069119,"artist_id":
30796,"song":
"\u751c\u751c\u7684","lrc":
"http:
//s.geci.me/lrc/374/37405/3740525.lrc","sid":
3740525}]}
很容易发现里面的歌词文件,然后缓冲到本地(MusicPlayer/Lryics)下,再按本地加载的方式就行了。
所以加载歌词文件要经过以下步骤:
1)通过地址查询出歌词的地址。
(URLConnection)
2)通过歌词地址缓冲歌词文件。
(URLConnection)
歌词处理
从网络上通过json解析出歌词地址后,还要通过下载把歌词内容提取出来。
比如《我们在一起》的歌词lrc文件部分内容:
[ti:
我们在一起][ar:
阿木][00:
00.00]歌曲我们在一起歌手阿木[00:
29.84]这是一场无路可退的战争[02:
20.24][00:
36.88]没有硝烟我们挽着手前行[02:
24.47][00:
44.29]不要哭泣我至爱的亲人[02:
31.64][00:
51.42]你们的心痛揪着我们的心[02:
38.12][00:
58.49]我们的眼睛就是你们的眼睛[02:
45.92][01:
06.41]争分夺秒是我们的使命[02:
53.41][01:
12.88]老人的颤抖,孩子的哭声[03:
00.24][01:
19.97]我愿用我的血换你们的生命[03:
36.18][03:
07.41][01:
27.19]我们在一起[03:
39.37][03:
10.75][01:
30.41]不管狂风和暴雨[03:
43.32][03:
14.51][01:
34.32]再大的震动都动摇不了我们的信心[03:
50.39][03:
21.72][01:
41.49]我们在一起[03:
53.95][03:
25.05][01:
45.44]姐妹兄弟一条心[03:
57.28][03:
28.58][01:
48.38]众志成城祈福祖国吉祥安宁
每次遍历一行,首先要把“[”替换成"",去匹配哪些是时间部分,正则匹配“^\\d{2}:
\\d{2}.\\d+$”,然后split("]"),得到一个数组data[],最后一个是内容,前面是歌词,遍历数组,装入时间歌词到list。
使用歌词
1建立歌词内容实体类
2.自定义View(可省略)
3.加入布局文件
4.编写歌词处理类
5.在Service里面实现同步更新歌词
3详细设计与实现
详细设计主要是指在系统需求分析的基础上,对整个系统的架构、机器设备的配置、数据的存贮规律以及整个系统的规划等方面进行合理的安排。
本章主要介绍系统的功能模块划分和详细设计实现部分,根据需求分析,对系统功能结构进行划分,并在此基础上逐步实现系统各项功能。
图4.0
上图是整个项目部署,adapter包是自定义的listview适配器,bean包封装了歌曲和歌词实体,server包里面是歌曲播放服务类,是android的四大组件之一,ui包是应用主要涉及的界面。
歌曲显示界面
歌曲显示界面设计在/TOLMP3/res/layout/play_queue_layout.xml中。
从数据库里面查找的数据封装成bean,然后通过适配器传入到界面中,核心代码如下。
/**
*往List集合中添加Map对象数据,每一个Map对象存放一首音乐的所有属性
*@paramMusicBeans
*@return
*/
publicstaticList
List
List
for(Iteratoriterator=MusicBeans.iterator();iterator.hasNext();){
MusicBeanMusicBean=(MusicBean)iterator.next();
HashMap
map.put("title",MusicBean.getMusicName());
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 在线音乐 播放 设计 文档