基于Android音乐播放器的设计与开发_第1页
基于Android音乐播放器的设计与开发_第2页
基于Android音乐播放器的设计与开发_第3页
基于Android音乐播放器的设计与开发_第4页
基于Android音乐播放器的设计与开发_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊基于Android音乐播放器的设计与开发.引言1.1项目开发的背景及环境1.1.1项目开发背景当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,使得手机操作系统也出现了不同各类,现在的市场上主要有三个手机操作系统,Windowsmobile,symbian,以及谷歌的Android操作系统,其中占有开放源代码优势的Android系统有最大的发展前景。个性音乐播放器是所有现代手机中必不可少的部分。本项目就是研究基于谷歌Android手机平台的音乐播放器。Android:是谷歌于2007年公布的开放式源代码手机系统,它的开放性就优于其它封闭式的手机系统,因此,任何人都可能根据自己的喜好将手机系统中的所有功能重新编写。这使得越来越多的人关注这个操作系统。一款专业的音乐播放软件是手机中必不可少的要素,几乎市场上所有的手机都拥有一个自带的音乐播放软件,通过软件可以对音乐欣赏中一些必要的元素进行人性化的设置,同时在操作的时候也能得到一定的便利,但是不能满足用户的所有要求,所以网上就出现了各种各样的手机音乐播放软件,来满足不同用户的不同要求。不同手机平台的手机,所支持的音乐播放软件也是各不相同,而现在最流行的手机平台就是google的android手机平台,所以本课题就致力于开发出一款基于android手机平台的音乐播放器,来满足用户的使用需求。1.1.2项目开发环境(1)Android简介android一词的本意指“机器人”,当时同时Android也是Google于07年11月5日宣布的基于Linux平台开源手机操作系统名称,该平台由操作系统、中间件、用户界面和应用软件组成,Android是基于JAVA并运行在Linux内核上的操作系统,这个操作系统是轻量级的,但是功能很全面。而且在这个操作系统上,Google公司已经内置了很多有用的软件,如打电话、发短信等,号称是首个为移动终端打造的真正开放和完整的移动软件。2008年9月22日,美国运营商T-MobileUSA在纽约正式发布第一款Google手机——T-MobileG1。该款手机为宏达电制造,是世界上第一部使用Android操作系统的手机,支持WCDMA/HSPA网络,理论下载速率7.2Mbps,并支持Wi-Fi。Android是Google开发的基于Linux平台的开源手机操作系统。它包括操作系统、用户界面和移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。谷歌与开放手机联盟合作开发了Android,这个联盟由包括中国移动、摩托罗拉、高通、宏达和T-Mobile在内的30多家技术和无线应用的领军企业组成。通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,(2)Android在中国截至目前,国内三大运营商、中兴通讯和华为等厂商以及来自产业链细小领域的业务提供商都已经加入该联盟,据统计,OHA的中国成员数量已达到12家,占据总成员席位的近1/5。GartnerIT系统高级分析师沈哲怡表示:“应该说,谷歌公司的强大号召力在中国得到了很好体现,前瞻的技术、可靠的价值链、持续的创新意识让中国很多企业一致看好Android。”中国的山寨产业已经成为手机市场不可忽视的“潜在力量”,但受制于成本和正版的限制,手机山寨产业对于手机操作系统的渴求更加强烈。但无论是对正牌或山寨的手机制造商、业务提供商还是电信运营商而言,他们的瓶颈都在于“拥有自主开发的手机操作平台并非易事”,即便是处于产业核心层面的电信运营商也不例外。而谷歌适时推出的开源、免费的手机操作平台Android正好满足了这一市场需求,为产业链相关企业提供了延伸业务领域的可能性,更为移动互联网领域的后进入者提供了开拓市场的有力武器。android在中国的前景十分广阔,首先是有成熟的消费者,在国内,android社区十分红火,这些社区为android在中国的普及做了很好的推广作用。国内厂商和运营商也纷纷加入了android阵营,包括中国移动,中国联通,华为通讯,联想等大企业,同时不仅仅局限于手机,国内厂家也陆续推出了采用android系统的MID产品,比较著名的包括由Rockchip和蓝魔推出的同时具备高清播放和智能系统的音悦汇W7,我们可以预见android也将会被广泛应用在国产智能上网设备上,将进一步扩大Andorid系统的应用范围。另一方面,由于国内政策的限制,导致Android的部分功能(如Androidmarket)在国内无法正常使用,目前常用的解决方法是使用类似A8VPN的VPN服务来访问。“Android平台的技术结构比较紧凑,市场推进有张有驰,再加上谷歌公司长期具备的创新精神,确实值得国内很多厂商信赖。”前述分析师沈哲怡表示。据了解,国内终端厂商和运营商看好Android,很大程度上也是因为其背后推动者谷歌对互联网趋势的深刻见解;同时也因为Android具备合理的系统内核设计,并拥有成熟的市场推广模式。而在这方面,同样是倡导“开放”的开源平台Linux,其市场表现却与Android有着天壤之别。截至2009年,Linux应用在桌面操作系统中只占据1%的市场份额,始终难成操作系统的主流。专家对此表示,仅仅是技术开源还不够,如果操作系统开发企业缺乏必要的市场化运作和整体推动力,忽视用户界面体验,最终其产品将无人问津,而Android在此方面则是一个成功案例。而在Android的设计理念中,开放和平等也有所体现。“开放性接口为应用程序的研发提供了一个宽阔平台,业务提供商不必担心技术垄断造成的压迫和威胁。”前述杨姓项目经理表示。其实Android平台的很多底层技术取自Linux,而在底层技术流的选择上,大部分的程序开发人员骨子里都有一种“反Windows”观念,“如果让一种技术处于长期垄断地位是十分可怕的,垄断者的轻微举动会对产业上下游造成很大影响,因此大部分技术人员会更倾向于开放的Android。”而从系统整体性角度,Android平台也提供了完备的解决方案,OHA的成员甚至可以拿来直接使用。如此讨巧的平台设计在中国迅速聚拢了一批通信领域的“明星企业”,像华为、中兴这类专注于通信领域,但已具备IC(集成电路)能力的厂商能够凭借此平台快速切入终端领域,降低成本且缩短了研发时间。(3)Android核心技术简介Android平台是基于java语言开发的,其中android主要是四大组建构成的,Activity、Service、BroadcastReceiver、ContentProvider。1.ActivityActivity就是一个用户界面,比如打电话程序,实现一个打电话的Activity,通讯录也是一个Activity,通话记录也是一个Activity等等,这些Activity都是独立的,但组合在一起就是一个完整功能的应用程序了。2.Service从字面上意思就是服务的意思,其实就是Activity的后面服务,他们在很多地方都相辅相成的,封装有一个完整的功能逻辑实现,Service就是为Activity在后面服务的,作为Activity的坚实后盾。Service在后台为Activity提供所需要的功能。Android中得服务其实与windows中得服务类似,它执行长时间运行的操作,或运程进程执行工作。服务不提供用户界面。Android中的服务,和我们通常说的Windows服务,Web的后台服务又有一些相近,它们通常都是后台长时间运行,接受上层指令,完成相关事务的模块。用运行模式来看,Activity是跳,从一个跳到一个,这有点像模态对话框,给一个输入,然后不管不顾的让它运行,离开时返回输出。而Service不是这样的,Service主要是等着上层连接上它,然后产生一段持久的通信。但和一般的Service还是有所不同,Android的Service和所有四大组件一样,其进程模型都是可以配置的,调用方和发布方都可以有权利来选择是把这个组件运行在同一个进程下,还是不同的进程下。它凸显了Android的运行特点。Android中用来做数据序列化的类是Parcel,封装了序列化的细节,向外提供了足够对象化的访问接口,Android号称实现非常高效。Service从实现角度看,最特别的就是RPC的实现了,其他内容,都会接近于Activity的一些实现。3.BroadcastReceiver从字面意思是广播接收者,其实和我们生活中得广播意思相近,在发生什么事情的时候,会以广播的形式告知我们。广播又分为普通广播和有序广播。普通广播是异步的,理论上是同时收到的。你不能对他做任何操作,不能终止。有序广播,在接收到广播时可以加入自己的操作,传递给下一个接收者,也可以终止广播。Android系统中最常见的广播电池电量低得时候,收到短信的时候,USB连接的时候等等。内容提供者主要用于应用程序的数据共享设置,你可以把数据存储在文件系统中,或者SQLite数据库上,网络,或者其他的持久性存储位置。你可以访问这些数据或者修改,其他应用程序也可以访问或者修改。在Android中,充分考虑了广泛的这类需求,于是就有了BroadcastReceiver这样的一个组件。每个BroadcastReceiver都可以接收一种或若干种Intent作为触发事件,当发生这样事件的时候,系统会负责唤醒或传递消息到该BroadcastReceiver,任其处置。在此之前和这以后,BroadcastReceiver是否在运行都变得不重要了。当BroadcastReceiver接收到相关的消息,它们通常做一些简单的处理,然后转化称为一条Notification,一次振铃,一次震动,抑或是启动一个Activity进行进一步的交互和处理。所以,虽然Broadcast整个逻辑不复杂,却是足够有用和好用,它统一了Android的事件广播模型,让很多平台都相形见绌了4.ContentProvider应用程序可以通过ContentProvider来访问其他应用程序的一些私有数据,这是Android提供的一种标准的共享机制。共享的数据可以存在在很多方面,比如在系统中、数据库中或者在其他的一些程序里。ContentProvider可以扩展自己的ContentProvider类,通过实现自己的类的接口来控制其他数据的存储。然后程序不会直接调用ContentProvider中的方法,而是通过任何一个能与Contentprovider通讯。任何时候当Android系统收到一个需要某个组件进行处理的请求的时候,Android会确保处理此请求的组件的宿主进程是否已经在运行,如果没有,则立即启动这个进程,当请求的组件的宿主进程已经在运行,它会继续查看请求的组件是否可以使用,如果不能立即使用,它会创建一个请求的组件的实例来响应请求。ContentProvider,内容提供者主要用于应用程序的数据共享设置,你可以把数据存储在文件系统中,或者SQLite数据库上,网络,或者其他的持久性存储位置。你可以访问这些数据或者修改,其他应用程序也可以访问或者修改。在各大组件中,Service和ContentProvider都是那种需要持续访问的。Service如果是一个耗时的场景,往往会提供异步访问的接口,而ContentProvider不论效率如何,都提供的是约定的同步访问接口。因为ContentProvider仅是提供数据访问的,它不能确信具体的使用场景如何,会怎样使用它的数据;而相比之下,Service包含的逻辑更复杂更完整,可以抉择大部分时候使用某接口的场景,从而确定最贴切的接口是同步还是异步,简化了上层调用的逻辑。1.2项目意义随着信息的高速发展手机已变的越来越普及尤其是智能手机,基于Android操作系统的手机就是在这样的趋势下逐渐一步步的走入我们的生活,因此,我们选择这样的研究课题最主要的一点是看在它的潜在市场价值,音乐播放器是手机中必不可少的一个应用程序,可发性和可研究性就不言而喻。现代的音乐播放器当然不能仅限于音乐的播放,它的功能应该更加多样化,界面更加丰富,操作更加人性化,因此开发一款自己与Android系统的音乐播放器具有很大的意义和市场价值。1.3小结在第一章中简单的介绍了Android现行的发展情况和Android音乐播放器在生活中的实用价值,最终要实现的目标,以及安卓手机音乐播放器的开发价值与应用前景。

2.系统分析2.1需求分析2.1.1总体目标本项目的总体目标是开发一个可以播放主流音乐文件格式的播放器,实现播放Mp3,Wma等多种格式等音乐文件的功能,并且能够控制播放、暂停、停止、上一曲、下一曲、音量调节、视觉外观、播放列表和歌曲文件的管理操作等多种播放控制功能,界面简明,操作简单。本项目是一款基于Android手机平台的音乐播放器,使Android手机拥有个性的多媒体播放器,使手机更生动灵活化,与人们更为接近,让手机主人随时随地处于音乐的旋律之中。使人们的生活更加多样化,也使设计者更加熟练Android的技术,了解Android在市场上的特点2.1.2具体目标功能需求具体分析如下:1、读取和删除歌曲文件能够搜索整个SD卡,自动将所有的歌曲信息导入到播放器的数据库中,并且显示于播放器的全部音乐播放列表中,显示的信息包括歌曲名称和歌手名字。能够在手机中删除歌曲文件。2、音乐播放功能实现音乐的播放,显示当前歌曲信息和下一首歌曲信息,实现播放/暂停,下一曲,上一曲,显示歌曲的时间以及前播放到的时间,滚动条显示播放进度,并且能够拉动滚动条跳转到想要播放的位置。3、显示歌词能够解析lrc文件,在音乐播放的同时滚动的显示当前歌曲段对应的歌词。4、播放列表播放列表具有增删改的功能,并且能够自如的导入和删除歌曲,创建自己不同分类的播放列表。5、播放模式的设置设置收听音乐的模式,包括随机播放,顺序播放和单曲循环,还可以设置音乐歌词的显示与否。2.2可行性分析可行性分析(FeasibilityAnalysis)也称为可行性研究,是在项目调查的基础上,针对新项目的开发是否具备必要性和可能性,对项目的开发从技术、经济、社会的方面进行分析和研究,以避免投资失误,保证项目的开发成功。可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决。2.2.1市场可行性随着科技的发展信息时代的到来,3G技术发展日益成熟随之而来的是3G手机的出现,基于Android操作系统的手机市场逐渐发展壮大,愈来愈多的人选择谷歌的Android手机逐渐形成一种趋势,因此这个市场的商业价值很高,所以选择开发基于Android平台的音乐播放器,虽然安卓手机用户的手机都有自带的音乐播放器但是功能过于简单,界面过于死板,正是出于这样的原因我们决定研发Android音乐播放器,我们所研发的音乐播放器能够读取手机里全部文件夹的音乐文件,播放时可以配合歌词的滚动显示,而且用户能够根据自己的喜好增加播放列表,播放界面更加绚丽人性化。因此研究一款基于Android平台的音乐播放器极具应用价值,这样可以在很大程度上增加Android手机用户的市场份额。所以从市场角度来看,十分有必要开发基于Android的音乐播放器。2.2.2技术可行性本项目需要用到Sun公司开发的Java技术以及Google公司开发的Android技术在eclipse环境下进行开发。Java技术发展至今已经非常成熟,而Android技术是以Java语言为基础的,所以本项目的开发在技术上是可行的。2.2.3操作可行性本项目开发后使用的用户主要是android系统手机的用户,只要拥有一台android操作系统的手机就可以安装本软件,本软件使用便捷,内存占用少,适合大多数用户使用。所以在操作上是可行的。2.3业务流程分析设计业务流程图(transactionflowdiagram,简称TFD),就是用一些规定的符号及连线来表示某个具体业务处理过程。业务流程图的绘制基本上按照业务的实际处理步骤和过程绘制。换句话说,就是一“本”用图形方式来反映实际业务处理过程的“流水账”。绘制出这本“流水账”对于开发者理顺和优化业务过程是很有帮助的。此款android音乐播放器的应用流程主要分析如下:1、用户打开播放器,直接进入的页面有两个选项卡,第一是全部音乐列表,第二个是播放列表,默认的是进入全部音乐列表,列表列出了手机SD卡中的所有音乐文件(包括音乐名称和歌手信息)。单击音乐跳转到播放页面;长按会弹出一个列表,列表中有两项,第一个是删除歌曲,第二个是加入播放列表,单击删除歌曲可以删除当前歌曲,单击加入播放列表可以选择相应播放列表。2、单击播放列表选项卡,列表列出了已经建立的播放列表,单击菜单键可以新建播放列表,单击播放列表可以打开播放列表,显示出列表中收藏的歌曲,单击歌曲可以进入播放页面;长按播放列表会弹出一个列表选项,可以选择对列表进行重命名、删除等操作。3、在音乐的播放页面,可以进行暂停/播放、下一曲、上一曲的操作,并且可以滚动显示当前歌曲的歌词,下一首歌曲的信息,同时也可以设置播放的模式(随机、顺序、单曲三种模式)。单击返回键音乐仍然在播放,并且全部音乐和播放列表两个选项卡页面的下方会显示出当前正在播放的歌曲,单击后重新可以进入正在播放的歌曲页面。业务流程分析图如图2-1。图2-1业务流程图2.4数据分析2.4.1数据流程图数据流图(DataFlowDiagram,简称DFD),是一种图形化技术,它描绘信息流和数据从输入移动到输出的过程中所经受的变换。在数据流图中没有任何具体的物理部件,它只是描绘数据在软件中流动和被处理的逻辑过程。数据流图是系统逻辑功能的图形表示,即使不是专业的计算机技术人员也容易理解它,因此是分析员和用户之间极好的通信工具。此外,设计数据流图时只需考虑系统必须完成的基本逻辑功能,完全不需要考虑怎样具体地实现这些功能,所以它是后面的软件设计的很好的出发点。数据流图有四种基本图形符号:箭头表示数据流;圆或椭圆表述加工;双杠表示数据存储;方框表示数据的源点或终点。音乐播放器的操作比较简单,中间的数据流也不是很复杂,具体的数据流程图如图2-2。图2-2数据流程图2.4.2数据字典数据项是描述数据的静态特性的最小数据组成单位,也就是不可再分的数据单位,如用户名,用户ID号等。Android音乐播放器系统中涉及的数据项主要有歌曲名称,歌曲路径,播放列表名称,歌手名,播放列表编号等。下面以歌曲路径为例来说明数据项。数据项系统名:android音乐播放器

编号:

条目名:歌曲路径

别名:

所属数据流:存储处:music表数据元素属性:

类型:字符型长度:20简要说明:歌曲路径是歌曲的标志性信息,也是读取歌曲的依据修改记录:编写汪露露日期2012.3.20审核汪露露日期2012.3.20表2-1

数据元素—歌曲路径数据流由一个或一组固定的数据项组成,主要由一个属性描述:数据流的来源;数据流的去处;数据流的组成;数据流的流通量;峰时的流通量。本系统有重要的数据流有歌曲信息,播放列表信息等。下面选中歌曲信息为例来说明数据流。数据流系统名:android音乐播放器

编号:

条目名:歌曲信息

别名:

来源:用户点击选择操作(程序自动识别点击的歌曲信息)去处:为播放或者对此歌曲进行其他处理数据流结构:歌曲信息={歌曲名称+歌曲路径}简要说明:通过用户点击的操作获取相应的歌曲信息对该歌曲进行操作。修改记录:编写汪露露日期2012.3.20审核汪露露日期2012.3.20

表2-2

数据流—歌曲信息数据存储的条目,主要描写该数据存储的结构,及有关的数据流和查询要求。音乐播放器中的数据存储主要有音乐信息,播放列表信息,下面以音乐信息为例来说明数据存储。数据存储系统名:android音乐播放器

编号:

条目名:音乐信息

别名:

存储组织:每一个音乐信息数据量:无限制主关键字:歌曲路径辅关键字:无记录组成:项名:

音乐路径音乐名称歌手名称正在播放标记

简要说明:读取SD卡中所有音乐文件后存放到数据库表中的记录修改记录:编写汪露露日期2012.3.20审核汪露露日期2012.3.20

表2-3数据存储—音乐信息 处理过程:对于数据流程图中的处理框,需要在数据字典中描述处理框的编号,功能的简要说明,有关的输入输出等。音乐播放系统中主要的处理过程有音乐播放,播放列表管理,歌曲管理等。下面以播放列表管理的处理过程为例说明。处理过程系统名:android音乐播放器

编号:

条目名:播放列表管理

别名:

输入:列表名称;列表编号;列表和歌曲信息输出:新建列表;重命名列表;删除列表;列表中歌曲显示;列表中歌曲删除加工逻辑:(1)用户可以新建,重命名,删除播放列表(2)用户可以将全部音乐中的歌曲加入到相应的播放列表中(3)用户可以显示播放列表中的歌曲也可以从播放列表中删除歌曲。简要说明:无。修改记录:编写汪露露日期2012.3.20审核汪露露日期2012.3.20表2-4处理过程—播放列表管理2.5小结在系统分析中,首先介绍了系统的需求分析和可行性分析,确定系统的综合功能需求。从技术可行性、经济可行性、操作可行性三个方面论述了系统的可行性。此外,在此章节中,绘制了该系统的业务流程图,进行了数据分析,其中数据分析从数据流图和数据字典两方面进行分析。

3.系统总体设计3.1系统的功能结构图功能结构图描述了系统各分功能之间的关系,或者说将系统的各个分功能有机地组合起来,就得到了功能结构图。一般用框图来表示,这个框图就成为功能结构图。功能结构图的建立是使系统从抽象走向具体的重要环节之一。通过功能结构图的建立,明确了实现系统的总功能所需的分功能、功能单元及其顺序关系。这些比较简单的分功能或功能单元,可以比较容易地与一定的物理效应及实现这些效应的实体结构相对应,从而可以得到实现所定功能需要的实体解答。本音乐播放器的系统功能表和系统功能结构图如下:功能类别子功能子功能全部音乐全部音乐菜单退出应用程序歌曲菜单播放->进入播放界面删除->数据库同步更新播放列表播放列表菜单退出播放新建播放列表->数据库同步更新重命名播放列表->数据库同步更新删除播放列表->数据库同步更新歌曲菜单播放->进入播放界面删除->数据库同步更新播放界面播放播放歌曲->线程启动->时间更新暂停暂停歌曲->线程暂停->时间暂停停止停止歌曲->线程停止->时间停止上一首列表索引变化->寻找上一ID歌曲下一首列表索引变化->寻找下一ID歌曲播放界面菜单返回到播放列表返回到主菜单隐藏播放界面播放设置单曲播放更改数据库,将模式改为单曲顺序播放更改数据库,将模式改为顺序随机播放更改数据库,将模式改为随机表3.1功能表图3-SEQ图3-\*ARABIC1功能结构图3.2功能模块介绍全部音乐浏览模块该模块能够搜索整个SD卡,自动将所有的歌曲信息导入到播放器的数据库中,并且显示于播放器的全部音乐播放列表中,显示的信息包括歌曲名称和歌手名字。能够在手机中删除歌曲文件,可以将相应的歌曲加入到指定的播放列表中。同时也可以点击菜单正常退出应用程序。3.2.2音乐播放模块该模块主要实现音乐的播放,显示当前歌曲信息和下一首歌曲信息,实现播放/暂停,下一曲,上一曲,显示歌曲的时间以及前播放到的时间,滚动条显示播放进度,并且能够拉动滚动条跳转到想要播放的位置。在音乐播放的同时能够同步显示歌词,歌曲暂停时歌词的滚动也会暂停,在音乐播放的同时滚动的显示当前歌曲段对应的歌词。3.2.3播放列表模块该模块能够新建播放列表,创建自己不同分类的播放列表,同时能够重命名播放列表和删除播放列表,并且能够自如的将歌曲导入到相应的播放列表中,也可以将播放列表中的歌曲删除。3.2.4播放设置模块设置收听音乐的模式,包括随机播放,顺序播放和单曲循环,当一首歌曲播放完后不需要手动点击到下一曲,播放器会自动跳转到下一曲,若是随机播放则下一曲随机,若是顺序播放则下一曲是当前所在播放列表的下一曲,若单曲循环则下一曲还是当前的歌曲。3.3数据库设计数据库设计(DatabaseDesign)是指根据用户的需求,在某一具体的数据库管理系统上,设计数据库的结构和建立数据库的过程。一般,数据库的设计过程大致可分数据库设计为4个步骤:(1)需求分析:调查和分析用户的业务活动和数据的使用情况,弄清所用数据的种类、范围、数量以及它们在业务活动中交流的情况,确定用户对数据库系统的使用要求和各种约束条件等,形成用户需求规约。(2)概念结构设计:对用户要求描述的现实世界(可能是一个工厂、一个商场或者一个学校等),通过对其中住处的分类、聚集和概括,建立抽象的概念数据模型。这个概念模型应反映现实世界各部门的信息结构、信息流动情况、信息间的互相制约关系以及各部门对信息储存、查询和加工的要求等。所建立的模型应避开数据库在计算机上的具体实现细节,用一种抽象的形式表示出来。以扩充的实体—(E-R模型)联系模型方法为例,第一步先明确现实世界各部门所含的各种实体及其属性、实体间的联系以及对信息的制约条件等,从而给出各部门内所用信息的局部描述(在数据库中称为用户的局部视图)。第二步再将前面得到的多个用户的局部视图集成为一个全局视图,即用户要描述的现实世界的概念数据模型。(3)逻辑结构设计:主要工作是将现实世界的概念数据模型设计成数据库的一种逻辑模式,即适应于某种特定数据库管理系统所支持的逻辑数据模式。与此同时,可能还需为各种数据处理应用领域产生相应的逻辑子模式。这一步设计的结果就是所谓“逻辑数据库”。(4)物理结构设计:根据特定数据库管理系统所提供的多种存储结构和存取方法等依赖于具体计算机结构的各项物理设计措施,对具体的应用任务选定最合适的物理存储结构(包括文件类型、索引结构和数据的存放次序与位逻辑等)、存取方法和存取路径等。这一步设计的结果就是所谓“物理数据库”。下面主要从概念设计和逻辑设计两个方面来阐述数据库设计。3.3.1概念结构设计概念结构是对现实世界的一种抽象,即对实际的人、物、事和概念进行人为处理,抽取人们关心的共同特性,忽略非本质的细节,并把这些特性用各种概念精确地加以描述。将需求分析得到的用户需求抽象为信息结构即概念模型的过程就是概念结构设计,是数据库设计关键。一般都以E-R模型即实体——联系图,为工具来描述概念结构。ER图如图3-2所示。图3-2E-R图3.3.2逻辑结构设计数据库概念设计阶段得到的E-R模型使用户的模型,它是独立于任何一种数据模型,独立于任何一个具体的数据库管理系统的信息结构。为了建立用户所要求的数据库,需要把上述概念模型转换为某个具体的数据库管理系统所支持的数据模型。数据库的逻辑设计就是将概念结构设计阶段完成的概念模型转换为能被选定的数据库管理系统支持的数据模型的过程。系统包含多个表格,查询功能也是将多个表格进行组合以后进行的,系统主要的表格和表结构如下所示:属性数据类型是否允许为空主键pathtextNotnullPrimarykeynametextNotnullisplayingintegerNotnullsingertext表3.2music表字段属性数据类型是否允许为空主键List_idintegerNotnullPrimarykeyList_isplayingintegerNotnullList_nametextNotnull表3.3list表字段属性数据类型是否允许为空主键music_list_lidintegerNotnullPrimarykeymusic_list_mptextNotnullPrimarykey表3.4music_list表字段属性数据类型是否允许为空主键modeintegerNotnullPrimarykey表3.5play_mode_table表字段3.4开发环境的配置3.4.1硬件环境处理器GenuineIntel(R)CPUT2080@1.73GHz操作系统WindowsXP内存2GBRAMWindowsXPProfessional-120MB3.4.2软件环境操作系统目前只支持XP(32-bit)、Vista(32/64-bit)、MacOSX10.4.8或更新版本(x86)、Linux。Android开发工具Eclipse版本要在3.3以上。因为开发是基于java的,所以jdk是少不了的,jdk要求是5.0或者6.0,我还是用5.0比较多,可以到sun官方下载。J2ME,现称为JavaME(JavaPlatform,MicroEdition)是为机顶盒、移动电话和PDA之类嵌入式消费电子设备提供的Java语言平台,包括虚拟机和一系列标准化的JavaAPI。它和JavaSE、JavaEE一起构成Java技术的三大版本,并且同样是通过JCP(JavaCommunityProcess)制订的。目前阶段,JavaME最流行的应用是游戏软件。因为与需要昂贵的专用设备和开发工具的竞争对手(如索尼和任天堂)相比,JavaME程序可以在PC机上开发和仿真运行,然后很容易地部署到目标机上,从而使其开发、测试和发布的变得容易,Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。Eclipse最初是由IBM公司开发的替代商业软件VisualAgeforJava的下一代IDE开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟Eclipse基金会。3.4.3开发调试环境图3-3开发调试环境开发调试的环境是安卓手机虚拟机,虚拟机拥有几乎所有手机的功能,调试的时候是将写好的程序安装在这个虚拟机中测试。3.5小结主要给出功能结构图,并介绍了功能模块,进行了数据库设计和开发环境的配置。其中数据库设计中,包括了概念设计中的实体联系图,逻辑结构中设计了主要的六个表,并给出了相关的属性,为系统设计提供数据了基础。最后在本节加入了系统开发环境的配置,为设计阶段做了铺垫

4.系统详细设计与实现4.1全部音乐浏览页面4.1.1全部歌曲显示图4-1全部音乐浏览页面Android中的ListView需要用到适配器来显示数据。系统默认的方式每一行只显示一个TextView,本播放列表实现了自定义的方式,使ListView的每一行显示一个音乐图片和一个歌曲名字。我们定义一个类AllMusicAdapter继承了BaseAdapter,然后通过算法重写getView()方法对这个适配器进行扩展,扩展成为能够在左边显示图片,右边上面显示歌曲名称,下边显示歌手信息。该方法返回一个View,即视图。关键代码:@Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ //TODOAuto-generatedmethodstub ViewHolderholder=null; if(convertView==null){ holder=newViewHolder(); convertView=mInflater.inflate(R.layout.musiclist,null); holder.img=(ImageView)convertView.findViewById(R.id.listitem); holder.title=(TextView)convertView.findViewById(R.id.title); holder.singer=(TextView)convertView.findViewById(R.id.singer); convertView.setTag(holder); }else{ holder=(ViewHolder)convertView.getTag(); } holder.img.setBackgroundResource(R.drawable.list); holder.title.setText(musicList.get(position).getMp3_name()); holder.singer.setText(musicList.get(position).getSinger()); holder.title.setSingleLine(); returnconvertView; }4.1.2歌曲删除图4-2长按列表弹出的选项歌曲删除的功能窗口是通过长按歌曲列表弹出的,实现方法是为ListView增加了一个长按监听器,主要是先为ContextMenu注册listView然后编写onCreateContextMenu()方法中的函数实现。关键代码:super.registerForContextMenu(listView);@Override publicvoidonCreateContextMenu(ContextMenumenu,Viewv, ContextMenuInfomenuInfo){ //TODOAuto-generatedmethodstub super.onCreateContextMenu(menu,v,menuInfo); menu.setHeaderTitle("选项"); menu.add(0,DELETE_MUSIC,Menu.NONE,"删除歌曲"); menu.add(0,ADD_MUSICLIST,Menu.NONE,"加入播放列表"); }@Override publicbooleanonContextItemSelected(MenuItemitem){ //TODOAuto-generatedmethodstub super.onContextItemSelected(item);////中间代码省略}图4-3删除歌曲提示该对话框用于在删除文件时提示用户是否确定删除,中间为一个Dialog对话框,具有Acitivty的属性,但是独立于界面的一个视图,该对话框中放置了一个布局文件。Dialog的创建:AlertDialog.Builder,AlertDialogalert=builder.create();alert.show();文件的删除需要添加用户权限android.permission.WRITE_EXTERNAL_STORAGE。4.1.3歌曲加入到播放列表图4-4选择添加的播放列表该对话框中间也放置了一个布局文件,布局文件中也是一个ListView,用于显示应用程序中已经创建的播放列表。关键代码:builder.setTitle("请选择播放列表");LayoutInflatermInflater=LayoutInflater.from(this);Viewview=mInflater.inflate(R.layout.alert_list,null);//把lay_out文件转化成View类型builder.setContentView(view);4.1.4退出应用程序图4-5退出菜单这是单击菜单按钮弹出的菜单项,菜单项需要先添加到菜单中。关键代码:@Override publicbooleanonCreateOptionsMenu(Menumenu){ //TODOAuto-generatedmethodstub super.onCreateOptionsMenu(menu); menu.add(0,EXIT,Menu.NONE,"退出"); returntrue; }图4-6退出确认提示退出程序之前需要停止歌曲播放,即需要停止播放服务Service,服务停止之后才能正常退出。有关服务的介绍会在音乐播放界面模块介绍。关键代码:@Override publicbooleanonOptionsItemSelected(MenuItemitem){ //TODOAuto-generatedmethodstub super.onOptionsItemSelected(item); intid=item.getItemId(); if(id==EXIT){ newAlertDialog.Builder(AllMusicActivity.this) .setIcon(R.drawable.dialog_information) .setTitle("提示") .setMessage("你确定要退出吗?") .setNegativeButton("确定", newDialogInterface.OnClickListener(){ publicvoidonClick(DialogInterfacedialog, intwhich){ /*在这里设计当对话框按钮单击之后要运行的事件*/ stopService(newIntent(AllMusicActivity.this, PlayerService.class)); System.exit(0); } }).setPositiveButton("取消",null).show(); returntrue; } returnfalse; }4.2音乐播放页面4.2.1音乐播放主页面图4-7播放主页面音乐播放主页面是由一个Activity来显示的,但是对于音乐播放需要在页面关闭之后音乐仍然能够播放,这就需要使用到Android四大组件之一的Service。Service相当于一个后台运行的Activity,所以可以把音乐播放的功能放在Service中来实现。音乐开始用startService(),停止用stopService()。关键代码:publicintonStartCommand(Intentintent,intflags,intstartId){ //TODOAuto-generatedmethodstubdb=this.openOrCreateDatabase(MusicInfo.DB_NAME,SQLiteDatabase.CREATE_IF_NECESSARY,null); intdoPlayer=intent.getIntExtra("action",0); index=intent.getIntExtra("index",0); list=PlayerActivity.list; list_name=intent.getCharSequenceExtra("list_name").toString(); if(doPlayer==CREATE){ if(player!=null){ player.release(); DBhelper.clearIsPlaying(db); } createPlayer(); }elseif(doPlayer==PLAY){ play(); }elseif(doPlayer==PAUSE){ pauseMp3(); }elseif(doPlayer==NEXT){ changeNextMp3(); }elseif(doPlayer==LAST){ changeLastMp3(); }elseif(doPlayer==MOVE){ move(); }elseif(doPlayer==HANDLER){ handler.removeCallbacks(rollback); }elseif(doPlayer==RESTART){ restart(); }else{ onDestroy(); } db.close(); returnsuper.onStartCommand(intent,flags,startId); }播放器播放、暂停、等功能如图4-7所示:各按钮水平放置,用的是布局中的线性布局TableLayout,TableLayout中依次放置播放,上一曲、暂停、下一曲按钮属性。音乐播放是由MediaPlayer来实现的,MediaPlayer类封装了播放(start()),停止(stop()),暂停(pause())等方法,实现音乐播放的不同操作可以通过调用MediaPlayer类的这些方法来实现。歌曲开始播放前同时要将music数据库表中的isplaying设置为1,标志正在播放的音乐,同时也要将list表中的isplaying标注为1。关键代码: //在music表和music——list表中标志正在播放的音乐 publicstaticvoidputPlayingMusic(Stringpath,SQLiteDatabasedb){ Stringwhere1=MusicInfo.MUSIC_PATH+"='"+path+"'"; ContentValuesvalues1=newContentValues(); values1.put(MusicInfo.MUSIC_ISPLAYING,1); db.update(MusicInfo.TABLE_NAME,values1,where1,null); } //在music表和music——list表中标志正在播放的音乐 publicstaticvoidputPlayingList(Stringlist_name,SQLiteDatabasedb){ Stringwhere2=MusicInfo.LIST_NAME+"='"+list_name+"'"; ContentValuesvalues2=newContentValues(); values2.put(MusicInfo.LIST_ISPLAYING,1); db.update(MusicInfo.LIST_TABLENAME,values2,where2,null); }播放器音轨的实现实现播放音轨配合音乐播放而向前移动需要随时获取歌曲播放进度,本音乐播放器选1秒为进度值,每隔1秒钟音轨向前移动相应的长度。而想要程序自动每隔1秒钟就获取一次播放时间就需要用到线程技术,每隔一秒钟,线程会自动获取当前歌曲的时间将音轨向前移动相应的位置。关键代码:classRollbackimplementsRunnable{ @Override publicvoidrun(){ //TODOAuto-generatedmethodstub position=player.getCurrentPosition(); PlayerActivity.bar.setProgress(position); min=position/1000/60; secd=position/1000%60; Stringm=min>9?min+"":"0"+min; Strings=secd>9?secd+"":"0"+secd; PlayerActivity.currentTime.setText(m+":"+s); handler.postDelayed(rollback,10); } }歌词显示功能歌词显示功能需要实现歌词与歌曲同步的滚动显示,显示的歌词需要与播放的歌曲匹配,并且正在播放的歌词需要设置为高亮。实现方法的关键技术是用线程获取当前播放的时间和重写TextView的方法,YcMusicLrcView.java文件就是重写textView的文件,重写了TextView类中的OnDraw方法。同时歌词滚动显示也是调用线程的方法。关键代码:1、为了实现歌词与歌曲同步显示就需要间隔性的获取歌曲播放的进度来调整歌词显示的进度,为了实现这种效果也需要用到线程技术,通过线程每隔100毫秒调用一次Index()方法,Index()方法可以获取歌曲播放时间从而获取歌曲播放的index实现代码如下: RunnablemRunnable=newRunnable(){ publicvoidrun(){ PlayerActivity.lrc.SetIndex(Index()); PlayerActivity.lrc.invalidate(); mHandler.postDelayed(mRunnable,100); }};2、在播放界面中,歌词显示用的是一个TextView,而一个简单的TextView远远无法满足我们的要求,为了实现歌曲的滚动和高亮显示就需要重写TextView的OnDraw方法,实现方法代码如下:<com.music.domain.YcMusicLrcViewandroid:id="@+id/mLrcView"android:layout_width="fill_parent"android:layout_height="50dp"android:textSize="15sp"></com.music.domain.YcMusicLrcView>protectedvoidonDraw(Canvascanvas){ super.onDraw(canvas); if(canvas==null){ return; } CurrentPaint.setColor(Color.CYAN); NotCurrentPaint.setColor(Color.WHITE); CurrentPaint.setTextSize(18); CurrentPaint.setTypeface(Typeface.SERIF); NotCurrentPaint.setTextSize(TextSize); NotCurrentPaint.setTypeface(Typeface.SERIF); try{ canvas.drawText(mSentenceEntities.get(Index).getLyric(),width/2, high/2,CurrentPaint); floattempY=high/2; //画出本句之前的句子 for(inti=Index-1;i>=0;i--){ //向上推移 tempY=tempY-TextHigh; canvas.drawText(mSentenceEntities.get(i).getLyric(),width/2, tempY,NotCurrentPaint); } tempY=high/2; //画出本句之后的句子 for(inti=Index+1;i<mSentenceEntities.size();i++){ //往下推移 tempY=tempY+TextHigh; canvas.drawText(mSentenceEntities.get(i).getLyric(),width/2, tempY,NotCurrentPaint); } }catch(Exceptione){ } }播放模式的设定播放模式的选择界面由控件RadioGroup来控制,一个RadioGroup里面有多个RadioButton项,多个RadioButton项只能同时选中一个,该播放器播放模式有单曲循环,随机播放,顺序播放等功能,不同的RadioButton选中之后,程序会监听到然后修改数据库的模式表。在playerActivity中已经注册了一个广播事件,而MediaPlayer自带一个CompletionListener监听器,它监听着歌曲是否正在播放或者是否播放完成,当歌曲播放完成时,会触发方法OnCompletionListener(),在方法OnCompletionListener()触发后广播事件会监听到,会根据数据库中模式表的模式信息跳转到下一曲。关键代码:publicclassNextBroadReceiverextendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent){ //TODOAuto-generatedmethodstub Intentpintent=newIntent(context,PlayerService.class); intlength=intent.getIntExtra("length",0); intindex=intent.getIntExtra("index",0); Stringlist_name=intent.getCharSequenceExtra("list_name").toString(); SQLiteDatabasedb=context.openOrCreateDatabase(MusicInfo.DB_NAME, SQLiteDatabase.CREATE_IF_NECESSARY,null); Stringmode=DBhelper.getMode(db); db.close(); if(mode.equals("random")){ index=(int)(Math.random()*length)-1; }elseif(mode.equals("repeat")){ index--; }else{ } if(index==length-1){ index=-1; } pintent.putExtra("index",++index); PlayerActivity.index=index; pintent.putExtra("action",PlayerService.NEXT); pintent.putExtra("list_name",list_name); context.startService(pintent); }}4.2.2音乐播放最小化页面图4-8播放最小化页面当在音乐播放页面单击返回按钮时,音乐播放的主页面会消失,然而想要重新进入播放页面就可以单击本地音乐和播放列表两个选项卡页面下面的一个TextView,这两个TextView会显示当前播放的歌曲名。重新进入播放主页面后,所有的页面信息也必须更新成音乐播放时间应该有的状态。关键代码:privatevoidsetOnTextListener(){ nowPlaying.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub if(PlayerService.player!=null){ Intentintent=newIntent(); intent.setClass(AllMusicActivity.this,PlayerActivity.class); intent.putExtra("key",1); startActivity(intent); } } });}4.3播放列表页面4.3.1新建播放列表图4-9新建播放列表播放列表的新建即在数据库的播放列表表中添加一条数据。关键代码://增加播放列表 publicstaticvoidputListItem(SQLiteDatabasedb,Stringname, ArrayList<CharSequence>list){ //TODOAuto-generatedmethodstub ContentValuesvalues=newContentValues(); values.put(MusicInfo.LIST_NAME,name); values.put(MusicInfo.LIST_ISPLAYING,0); db.insert(MusicInfo.LIST_TABLENAME,null,values); ListMusicActivity.adapter.notifyDataSetChanged(); updateList(db,list); }4.3.2重命名播放列表图4-10长按播放列表弹出选项图4-12重命名弹出框关键代码://重命名播放列表 publicstaticvoidrenameList(SQLiteDatabasedb,Stringlist_name,StringnewName, ArrayList<CharSequence>list){ //TODOAuto-generatedmethodstub Stringwhere=MusicInfo.LIST_NAME+"='"+list_name+"'"; ContentValuesvalues=newContentValues(); values.put(MusicInfo.LIST_NAME,newName); db.update(MusicInfo.LIST_TABLENAME,values,where,null); ListMusicActivity.adapter.notifyDataSetChanged(); updateList(db,list); }4.3.3删除播放列表图4-13播放列表删除确认关键代码: //删除播放列表 publicstaticvoiddeleteList(SQLiteDatabasedb,Stringlist_name, ArrayList<CharSequence>list){ Stringwhere=MusicInfo.LIST_NAME+"='"+list_name+"'"; db.delete(MusicInfo.LIST_TABLENAME,where,null); ListMusicActivity.adapter.notifyDataSetChanged(); updateList(db,list); }4.3.4播放列表中歌曲显示页面图4-14播放列表显示页面播放列表中删除歌曲相当于删除歌曲与列表的关系,即从music_list表中删除数据。关键代码: publicstaticvoiddeleteMusic_List(SQLiteDatabasedb,Stringpath, intlist_id){ //TODOAuto-generatedmethodstubStringwhere=MusicInfo.MUSIC_LIST_LID+"="+list_id+"and"+MusicInfo.MUSIC_LIST_MP+"='"+path+"'"; db.delete(MusicInfo.MUSIC_LIST_TABLE,where,null); }4.4数据存储方式在播放器正常运行时,由于各界面存在相互跳转,为了避免数据在界面跳转的过程中丢失,我们需要将一些数据进行临时存储或者永久存储。保存数据Android作为一种手机操作系统,提供了如下几种存取数据的方式:Preference(配置)、File(文件)、SQLite数据和网络。保存数据另外,在Android中各个应用程序组件之间是相互独立的,彼此的数据不能共享。为了实现数据的共享,Android提供了ContentProvider组件来实现应用程序之间数据的共享158314.4.1SharedPreferencesPreferencePreference提供了一种轻量级的数据存取方法,一般数据比较少,一些简单的配置信息。它以“键-值”(是一个Map)对的方式,将数据保存在一个XML配置文件中使用到的接口:android.content.SharedPreferences提供了保存数据的方法android.content.SharedPreferences.Editor提供了获得数据的方法以播放器中的播放模式存取为例:(1).xml配置文件的读取我们仍以播放模式读取为例:当需要用到播放模式的确定时,我们将读取.Xml文件,同样用共享文件类SharedPreferences通过用方法getSharedPreferences("SET_MSG",MODE_WORLD_READABLE),并且是只读方式获得.Xml的文件内容。SharedPreferences的对象调用方法getString("sigle_Play",null),方法返回一个String类型的值,即是我们以前存储进去的String值。此方法当该标记不存在时会默认返回一个null值。获得成功后我们就可以运用当前的值再对程序进行操作了。(2).xml配置文件的存储类SharedPreferences。它有一个方法getSharedPreferences(参数1,参数2),参数1为写进时的标记,便于在从其中读取出来时的标记,参数2为读取模式,有只写模式(MODE_WORLD_WRITEABLE)和只读模式(MODE_WORLD_READABLE),在写之前将其置入编辑状态,用静态方法SharedPreferences.Editoreditor=sp.edit();然后对象editor可以存入一个HashMap<key,values>类型的键值,即putString(KEY,VALUES),这样,我们可以将List中的对象转化成一样长的字符中放进配置文件中。当写入成功时,android系统会自动在目录data/data/工程包名/shared_prefs/目录下生成一个配置文件。146994.4.2File存储方式我们可以将一些数据直接以文件的形式保存在设备中。例如,一些文本文件、PDF文件、音视频文件和图片等。Android提供了文件读写的方法方法Context.openFileInput()获得标准Java文件输入流(FileInputStream)Context.openFileOutput()获得标准Java文件输出流(FileOutputStream)Resources.openRawResource(R.raw.myDataFile)方法返回InputStream。209344.4.3SQLiteDatabase数据库SQLite是一个嵌入式数据库引擎,针对内存等资源有限的设备(如手机、PDA、MP3)提供的一种高效的数据库引擎SQLite数据库不像其它的数据库(如:Oracle),它没有服务器进程。所有的内容包含在同一个单文件中。该文件是跨平台的可以自由拷贝。基于其自身的先天优势,SQLite在嵌入式领域得到了广泛应用SQLiteDatabase类SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法常用方法(图4-15)图4-15SQLiteOpenHelper类SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本更新。一般的用法是定义一个类继承之,并实现其两个抽象方法onCreate(SQLiteDatabasedb)和onUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion)两个抽象方法来创建和更新数据库常用方法(图4-16)图4-16/data/data/package/shared_prefs/Android的三种数据存储方式则让我们可以轻松方便的进行程序编写和数据的访问,更不会让不该消失的数据消失,这对我们进行程序书写有很大我帮助。/data/data/package/shared_prefs/4.5小结本章主要介绍音乐播放器中各种功能实现用到的主要技术,重点介绍了Java线程技术和重写的技术。最后还介绍了Android中使用的三种存储方法,以及本音乐播放器系统用到的存储方法。

5.未能解决的难点与应用畅想5.1难点该播放器原先设计的是可以播放wma等各种格式的音乐,但是android的SDK中的MediaPlayer类只支持MP3格式的播放,需要播放其他格式的音乐则需要编写底层的解码代码,由于本人的技术有限,未能实现这一功能。5.2应用畅想随着Android系统的发展,基于Android系统的应用也层出不穷,创意百出,安卓市场上的音乐播放器也是花样百变,例如:天天动听,酷狗音乐等等。这些音乐播放器已经做得非常完善,支持各种音乐格式的播放,可以随心改变播放界面皮肤,可以甩着听音乐。对于这些各种各样的创意我也想提出一点自己的观点。1、现代人大多喜欢边听音乐边看小说,然而想要同时做这两件事就得打开两个应用程序,因此能不能将手机阅读器和音乐播放器结合起来,这样就避免了同时在两个应用程序之间切换的麻烦,同时节省了手机内存。2、百变的手机铃声是展示个性的最好方式,很多人都存在着这样的困扰,想把一首音乐的一个片段设置为铃声,这样必须在电脑上用相应的工具截取然后保存在手机里才能实现。但这样的操作过于繁琐,所以可以给手机音乐播放器添加一个截取音乐片段的功能,使用户能够更加自由的玩转手机。

结论通过对Android手机平台的音乐播放器软件的开发,使我对Android音乐播放器系统的整体设计有一个深入的了解,对整个流程也会有一个清晰的认识。开发Android音乐播放器,要抓住开发的核心部分,音乐播放器大体由全部音乐浏览、播放主界面、播放列表、播放模式设置四大大核心组成,只要掌握了这四部分的开发,音乐播放器就能初具规模。而其它的功能都是在这四个功能的基础上去补充添加的。音乐播放器系统实现了播放器的基本功能:播放,暂停、停止、上/下一首、音量调节、歌词

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论