• 3.52 MB
  • 2022-04-22 11:15:25 发布

基于Android平台的音乐播放器设计与实现电气工程及其自动化毕业论文.doc

  • 30页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'巢湖学院2013届本科毕业论文(设计)XX学院本科毕业论文(设计)题目基于Android平台的音乐播放器设计与实现院(系)电子工程与电气自动化学院专业电气工程及其自动化学生姓名学号指导教师职称论文字数80000完成日期:年月日23 巢湖学院2013届本科毕业论文(设计)巢湖学院本科毕业论文(设计)诚信承诺书本人郑重声明:所呈交的本科毕业论文(设计),是本人在导师的指导下,独立进行研究工作所取得的成果。除文中已经注明引用的内容外,本论文不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。本人签名:日期:巢湖学院本科毕业论文(设计)使用授权说明本人完全了解巢湖学院有关收集、保留和使用毕业论文(设计)的规定,即:本科生在校期间进行毕业论文(设计)工作的知识产权单位属巢湖学院。学校根据需要,有权保留并向国家有关部门或机构送交论文的复印件和电子版,允许毕业论文(设计)被查阅和借阅;学校可以将毕业论文(设计)的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存、汇编毕业,并且本人电子文档和纸质论文的内容相一致。保密的毕业论文(设计)在解密后遵守此规定。本人签名:日期:导师签名:日期:23 巢湖学院2013届本科毕业论文(设计)基于Android平台的音乐播放器设计与实现摘要Android是一种基于Linux的自由及开放源代码的操作系统,其最大的优势就是显著的开放性。开放的源码吸引大量的开发者和手机开发商,开放的平台带来更大的竞争,让更多的消费者能够以低价位买到心仪的手机。随着智能手机的普遍和Android应用的日益丰富,一个崭新的平台也将走向成熟。本课题的目的就是开发出一款基于Android平台,可以播放MP3歌曲文件的音乐播放器。播放器的界面新颖,功能丰富,操作方便。播放器主要从界面的设计着手,设计了欢迎界面、功能界面、扫描界面、显示歌曲列表界面,播放及显示歌词界面,实现了播放歌曲的基本功能,还有歌词同步显示、支持手势切换、后台播放歌曲,自动关闭播放器等功能。关键词:Android;开放;音乐播放器23 巢湖学院2013届本科毕业论文(设计)DesignandImplementationofMusicPlayerBasedonAndroidPlatformAbstractAndroidisafreeandopensourceLinux-basedoperatingsystemwithopennesssignificantly.Opensourceattractalotofdevelopersandmobilemanufacturers,anopenplatformcanbringmoregreatercompetition,leadtomoreconsumerstobuylow-pricedfavoritephones.AnewplatformwillbematurewithsmartphoneswidespreadlyandAndroidapplicationsrichincreasingly.ThepurposeofthistitleistodevelopamusicplayerbasedonAndroidplatform,thatcanplayMP3musicfiles.TheplayerhasprettyUI(UserInterface),abundantfunction,andeasytooperate.ItmainlystartfromthedesignofUI,designthewelcomeinterface,functioninterface,scanninginterface,displaythesongslistinterface,playmusicandshowlyricsinterface,realizedthebasicplayingfunctionbesidesshowlyricssynchronously,supportforgesturestoswitch,playmusicsbackground,automaticallyshutdownplayer,andotherfunctions.KeyWords:Android,open,MusicPlayer23 巢湖学院2013届本科毕业论文(设计)目录第一章绪论11.1研究背景及意义11.2研究内容1第二章Android应用概述22.1创建Android应用22.2项目目录简介2第三章播放器总体设计43.1播放器功能需求分析43.2播放器设计总体流程5第四章播放器设计与实现64.1界面的设计64.2功能的实现74.2.1动态图片的实现74.2.2Adapter的实现84.2.3扫描文件的实现114.2.4数据存取的实现124.2.5手势滑动的实现134.2.6歌词显示的实现134.2.7播放歌曲的实现15第五章播放器运行测试18参考文献20致谢2123 巢湖学院2013届本科毕业论文(设计)第一章绪论1.1研究背景及意义Android,一种基于Linux的自由及开放源代码的操作系统。2012年11月数据调查显示,Android占有全世界智能手机操作系统76%的市场份额,而中国市场占有率达90%。随着Android智能手机价格的平民化,那些功能不强,画面单调,键盘操作过时的塞班系统手机已经逐渐被淘汰了。在Android平台开发应用或游戏,前景广阔,市场需求量大。以前落后的操作手机上所有能玩的,在Android平台都能做到,而且做得更好,界面效果更炫,用户体验更佳。本项目是一款基于Android平台的音乐播放器。这是一个对于开发者而言比较容易上手的项目,对于用户来说是一个常用的应用软件。研究了多款音乐播放器应用,积累了一定的图片素材,借鉴了部分的布局设计,为本项目的开发做好充分准备。本项目希望可以做到让用户随时随地处于音乐旋律之中,获得舒缓压力,调整心情的最佳体验。同时,使设计者更加熟练的使用Android技术,积累开发项目的宝贵经验。1.2研究内容目前,Android手机音乐播放器技术虽然已经成熟,但是用户体验并不很好,为用户加载许多不必要图片信息,植入一些烦人的广告,浪费用户流量。本项目制作的是一款简约而不简单的音乐播放器,以下将是本项目需要深入研究的内容:1、Android的界面添加动态图片;2、编写Sqlite数据库语句存取用户数据;3、对播放器界面增加手势的支持;4、关闭播放器界面后台播放歌曲;5、播放界面同步显示歌词。6、歌词界面增加手势改变播放进度的功能。7、实现定时自动关闭播放器功能。23 巢湖学院2013届本科毕业论文(设计)第二章Android应用概述2.1创建Android应用新建一个Android项目,新建的项目信息如图2-1所示:这是最新版ADT(AndroidDevelopmentTools)插件,版本21。如果ADT版本较低,界面是不同的。项目要求智能手机最低Android2.2系统。图2-1新建AndroidProject2.2项目目录简介1.展开res目录,如图2-2所示。anim、drawable和raw默认是没有的。这是本项目需要新建的,且文件夹的命名是固定的。res是resource的缩写,里面存放许多资源文件,可以直接被我们在代码中直接引用。anim主要存放动画布局xml文件,drawable、drawable-hdpi、drawable-ldpi、drawable-mdpi和drawable-xhdpi都是存放图片资源的,根据手机的分辨率的不同自动匹配使用什么样的图片。layout目录是存放界面布局文件,values目录存放字符串资源,颜色资源,尺寸大小资源等。2.与res目录功能类似的是assets目录,但是assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件是不能直接引用的,可以存放一些图片,html,js,css等文件。23 巢湖学院2013届本科毕业论文(设计)图2-2res目录的层次1.如图2-3所示,gen目录是Android系统自己所维护的文件目录,目录下的R文件自动编译生成,自动更新修改。R文件是预编译res目录所生成的Java文件,如果在drawable-hdpi目录下存放一张背景图片splash_bg.png;那我们在Java代码中引用这张图片资源就是R.drawable.splash_bg。图2-3gen目录的层次4.如图2-4所示,bin目录里存放的是编译好的二进制文件,设计者只需要知道bin目录里有这个项目所生成的apk文件,可以直接安装在手机上运行。图2-4bin目录的层次5.如图2-5所示,src目录存放设计者所写的所有Java代码,目录里的文件夹都是每个类所在的包名,Java中包的概念就是给文件分类到不同的文件夹中。23 巢湖学院2013届本科毕业论文(设计)图2-5src目录的层次第三章播放器总体设计3.1播放器功能需求分析项目的设计流程通常是基于项目的功能来安排设计的。以下是播放器的功能需求分析:1.提供两种扫描SDCard(手机内存卡)中MP3歌曲文件的方式,一键扫描所有存在的歌曲文件和用户指定文件夹进行扫描。2.扫描完成后,歌曲自动分类,保存到Sqlite数据库。Menu菜单提供重新扫描的功能,方便用户再次扫描。3.“本地音乐”界面中可以添加或者移除最爱歌曲,添加音乐到“播放列表”,在“播放列表”中移除歌曲。4.播放歌曲设定,暂停和改变播放进度。选择上一首,下一首,改变播放的模式(顺序播放,单曲循环,全部循环,随机播放)。5.主界面时,手指滑动屏幕,就可以跳到显示歌词界面,在显示歌词界面中能同步显示歌词,手指滑动屏幕,改变播放进度。隐藏播放器界面,后台播放歌曲。通知栏显示播放曲目。6.提供自动关闭播放器的功能。当用户点击Menu中弹出的“睡眠”菜单,选择多长时间后关闭,播放器会自动关闭。7.本播放器在界面上做了一个尝试性的创新,让界面显示一张动态图片,(android系统不能直接显示.gif动态图片的)。23 巢湖学院2013届本科毕业论文(设计)3.2播放器设计总体流程Step1:欢迎界面准备好raw文件下的音频文件播放音乐;在布局文件中定义一个ImageView控件,用Handler控制显示不同图片,形成gif动画效果;然后用Handler控制不同背景图片的显示。Step2:功能主界面主界面的布局文件内容:在顶部显示动态图片,底部显示播放控制的控件,中间显示未知,是可变的区域,用于显示功能菜单、歌曲列表等内容的区域。Step3:选择扫描方式界面显示两个Button按钮控件,监听器事件不同。点击自定义扫描,跳转到另一个Activity界面,用户指定文件夹扫描的界面Step4:自定义扫描界面显示手机内存卡可以操作的文件夹目录层次,用户点击CheckBox单选框选择扫描,出现扫描按钮,点击扫描。显示目录层次用ListView,需要编写合适的Adapter。Adapter含有CheckBox事件监听器。扫描歌曲完成后,需要对歌曲信息分类,然后创建表来保存数据,需要编写Sqlite数据存储业务逻辑代码。Step5:显示歌曲界面扫描完成后,显示歌曲界面。可以用同一个ListView,但需要编写不同的Adapter。显示“本地歌曲”的Adapter需要有添加最爱歌曲和添加到“播放列表”两个按钮;显示“播放列表歌曲”需要有移除歌曲按钮;显示其他歌曲界面不需要其他按钮。Step6:播放歌曲编写Service类,可以后台播放歌曲。用Handler控制SeekBar进度的更新。暂停、上一首、下一首、播放模式的控制全部由Service来完成。Step7:显示歌词用IO流读取lrc文件,分别读取时间和内容。然后用Handler不断的更新显示的歌词位置。手势滑动,获取滑动距离,换算成时间,改变播放进度。Step8:Menu界面和功能Menu采用PopupWindow弹出菜单,功能有扫描,睡眠,退出,重新扫描即清空数据库信息,定时关闭使用线程检测是否到达指定时间,退出功能需要关闭数据库,关闭Service,finishActivity。23 巢湖学院2013届本科毕业论文(设计)第四章播放器设计与实现4.1界面的设计Android应用开发中在res/layout目录中编写xml文件来设计界面。如图4-1是第一个界面,也是播放器的欢迎界面,在LinearLayour布局中使用ImageView控件,不断改变ImageView显示的图片,形成动态效果。图4-1播放器欢迎界面如图4-2所示是欢迎界面跳转之后的功能主界面。顶部显示动态图片,中间显示了功能清单,底部显示播放歌曲控制的控件。接着需要编写用户扫描歌曲的界面,如图4-3所示。选择扫描方式的界面提供给用户两个Button。扫描歌曲完成后需要显示歌曲列表,这是需要用ListView搭配合适的适配器Adapter来实现的,关于Adapter的使用后面论述。Android任何功能实现的基础都是良好的界面,界面的好坏直接影响到用户的好感度,所以对于Android应用的开发,尤其要注意界面的开发。如今大多数应用的版本升级,做的基本上都是设计更好的界面赢得更多用户的青睐。23 巢湖学院2013届本科毕业论文(设计)图4-2播放器主界面图4-3选择扫描方式4.2功能的实现4.2.1动态图片的实现动态图片需要在drawable目录下,新建xml文件,根元素是level-list。代码如下:有多少帧图片对于编写多少个item。23 巢湖学院2013届本科毕业论文(设计)在代码中用Handler控制,主要逻辑代码如下:privateintlevel=0;//定义一个变量,控制显示第几张图片,值与android:maxLevel的值对应。privateHandlermHandler=newHandler(){publicvoidhandleMessage(android.os.Messagemsg){if(msg.what==-1){level++;//自增if(level==50){//停止显示动画,进行下一步操作。}else{anim_imageview.getDrawable().setLevel(level);/不断的切换下一张图片sendEmptyMessageDelayed(-1,100);//图片切换间隔时间为100ms}}在onCreate方法中执行mHandler.sendEmptyMessage(-1);那么就会立即执行Handler中的handleMessage方法,匹配msg.what==-1的代码块执行。然后再sendEmptyMessageDelayed(-1,100);表示延时100ms继续执行msg.what==-1的代码块,类似于一种循环的效果。4.2.2Adapter的实现安卓应用绝大多数情况需要使用到ListView控件,而显示ListView控件就通常需要编写合适的Adapter。Adpter的作用就是告诉ListView控件每个Item布局(子布局)显示什么,怎样显示。所以编写一个Adpter,首先编写Item布局显示的内容。下面是一个Adapter的核心代码,实现效果如图4-4所示。publicclassListingMusicAdapterextendsBaseAdapter{23 巢湖学院2013届本科毕业论文(设计)privateContextmContext;privateListlistingMusics;//播放列表中的歌曲publicListingMusicAdapter(ContextmContext,ListlistingMusics){this.mContext=mContext;this.listingMusics=listingMusics;}publicintgetCount(){returnlistingMusics.size();//返回个数对应显示子布局的个数}publicObjectgetItem(intposition){returnlistingMusics.get(position);}publiclonggetItemId(intposition){returnposition;}//Adpter的编写,重点是需要重写getView方法。publicViewgetView(finalintposition,ViewconvertView,ViewGroupparent){ViewHolderholder=null;if(null==convertView){convertView=LayoutInflater.from(mContext).inflate(R.layout.list_musics_item,null);holder=newViewHolder();holder.music_count=(TextView)convertView.findViewById(R.id.listing_music_seq);holder.music_name=(TextView)convertView.findViewById(R.id.listing_music_name);holder.music_singer=(TextView)convertView.findViewById(R.id.listing_singer);holder.subLay=(LinearLayout)convertView.findViewById(R.id.listing_sub_layout);convertView.setTag(holder);}else{holder=(ViewHolder)convertView.getTag();}holder.music_count.setText((position+1)+"");holder.music_name.setText(listingMusics.get(position).getMusic_name());23 巢湖学院2013届本科毕业论文(设计)holder.music_singer.setText(listingMusics.get(position).getSingername());holder.subLay.setOnClickListener(newView.OnClickListener(){publicvoidonClick(Viewv){//数据库更新播放列表中的歌曲。});returnconvertView;}classViewHolder{TextViewmusic_count;TextViewmusic_name;TextViewmusic_singer;LinearLayoutsubLay;}}图4-4播放列表的歌曲界面Adapter编写好之后,使用Adapter代码如下:Viewview=inflater.inflate(R.layout.local_music,null);ListViewlistingView=(ListView)view.findViewById(R.id.local_music_listview);ListingMusicAdapterlistingAdapter=newListingMusicAdapter(this,listingMusics);listingView.setAdapter(listingAdapter);//ListView调用setAdapter方法。23 巢湖学院2013届本科毕业论文(设计)listingView.setOnItemClickListener(itemPlayListener);播放器很多界面都需要编写Adapter,原理是一样的,不同的是getView方法根据不同布局效果的重写内容。4.2.3扫描文件的实现项目设定两种扫描歌曲文件的方式。一键扫描,扫描SDCard中所有歌曲文件;自定义扫描,扫描用户指定的文件夹中MP3歌曲文件。第一种方式,使用系统对外提供ContentProvider的URI(统一资源标识符,标记唯一性的),MediaStore.Audio.Media.EXTERNAL_CONTENT_URI。Cursorcursor=getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,MediaStore.Audio.Media.DEFAULT_SORT_ORDER);获得Cursor对象,对其进行循环遍历可以得到所有歌曲,然后进行存储。StringmusicName=cursor.getString(cursor//获取歌曲的名字.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));Stringalbum=cursor.getString(cursor//获取歌曲专辑名字.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));Stringartist=cursor.getString(cursor//获取歌手名字.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));Stringurl=cursor.getString(cursor//获取歌曲所在文件目录路径getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));当用户点击自定义扫描,页面会切换到另一个Activity,界面如图4-5所示。这个界面需要编写Adapter,然后给CheckBox注册监听器。23 巢湖学院2013届本科毕业论文(设计)图4-5自定义扫描歌曲的界面用户选中某些文件夹,然后编写递归方法对文件夹检测所包含的MP3文件,存储到一个集合中,再重新对该集合中文件路径遍历,与系统提供的歌曲URI遍历的路径比较,相等即可获取歌曲信息,并保存到数据库中。4.2.4数据存取的实现扫描文件,需要保存在数据库中。保存到Sqlite数据,需要新建一张表。Android系统提供一个SQLiteOpenHelper类,设计者继承这个类就可以很方便的建立一张数据表,重写OnCreate方法,执行建表的SQL语句(SQL语句的编写与大部分数据库建表的语法是相同的)即可。表建好之后就是设计者要编写对表增删改查四种操作的业务逻辑代码。以下是SQLite操作简要的代码:第一步:创建表publicvoidonCreate(SQLiteDatabasedb){//编写创建表的SQL语句“createtable”+TABLE_NAME+...//执行SQL语句:db.execSQL(sql)}第二步:打开数据库,调用getWritableDatabase()方法privateSQLiteDatabasedb;publicSqlBo(Contextcontext){db=newDBHelper(context).getWritableDatabase();23 巢湖学院2013届本科毕业论文(设计)}第三步:编写数据操作方法:publicvoidinsert(Musicmusic){//保存歌曲//insertinto编写插入一条记录的SQL语句;//执行db.execSQL(sql,newObject[]{})}publicListfindAllMusic(){//获取所有歌曲Cursorcursor=db.rawQuery("select*from"+DBHelper.TABLE_NAME,null);//对cursor对象进行循环遍历,保存到集合中}publicMusicfindMusicById(intid){//获取单个Music对象Cursorcursor=db.rawQuery("select*from"+DBHelper.TABLE_NAME+"where_id=?",newString[]{id+""});//遍历cursor,创建music对象,然后给music对象属性赋值}publicintupdateFavorite(Musicm){//修改歌曲信息//执行db.update(表名,修改的值,字段名,字段值);语句}publicvoiddeleteAll(){//清空所有歌曲信息db.delete(DBHelper.TABLE_NAME,null,null);}4.2.5手势滑动的实现Android系统支持手势功能,播放器添加了对手势的支持。当用户滑动屏幕,页面会跳转,歌词会改变进度,这些都需要手势来完成的。手势的实现思路如下:implementsOnGestureListener,OnTouchListener//实现或注册上述两个监听器接口privateGestureDetectormGestureDetector;//用于识别手势的对象//onCreate方法中,给mGestureDetector赋值mGestureDetector=newGestureDetector(this);publicbooleanonTouch(Viewv,MotionEventevent){returnmGestureDetector.onTouchEvent(event);23 巢湖学院2013届本科毕业论文(设计)}publicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY){//重写onFling方法floatx1=e1.getX();floatx2=e2.getX();//检测两点间的距离和滑动时的速率velocityX//判断滑动时的方向(左右)和速率}4.2.6歌词显示的实现歌词的实现前提是歌词文件与歌曲文件名字相同,在同一目录下,而且歌词文件格式是lrc。设计思路是自定义一个LrcView继承View重写OnDraw方法,在定义一个Lrc歌词对象,声明onDraw方法,让对象自己进行绘制。代码思路如下:publicclassLrcViewextendsView{protectedvoidonDraw(Canvascanvas){lrc.onDraw(canvas,getWidth(),getHeight());//lrc对象自己绘制,传入Canvas作为画家,设定画布的宽和高}publicvoidupdateTime(intcurrentPosition){lrc.updateTime(currentPosition);//及时更新显示歌词播放时间}}publicclassLrc{1.判断有没有歌词文件,有就用IO流读取歌词文件,解析出时间和内容2.把解析出的时间和内容封装成一个对象存放,在把这个对象存放到List集合中。3.根据播放歌曲进度传入的参数在Lrc对象中定义的onDraw方法中动态改变歌词显示的内容和位置}歌词的显示难点是怎么确定一句话显示的位置,也就是第一个字的显示的x,y坐标。已知LrcView的宽width和高height,根据Paint对象,可以求出一句话所占的面积,即宽textWidth=p.measureText(str)和高textHeight=p.getSize()。X=(width-textWidth)/2;求出x的坐标。图4-6求出y坐标图例23 巢湖学院2013届本科毕业论文(设计)图4-6求出y坐标手势滑动改变播放进度及歌词的显示,是在播放歌曲的Activity中给LrcView设置OnTouchListener,重写onTouch方法,判断是否移动和移动的距离,然后与y坐标相加或相减。移动距离的变化值除以所有歌词包括间距的总距离的比值等于播放的进度的变化值除以歌曲总进度。从而求出播放进度的变化值,然后加上当前播放的进度,就可以改变歌曲的播放进度。4.2.7播放歌曲的实现播放歌曲用到了Android中的另一个重要控件Service。Service本质同Activity是一样的,但是Service是没有界面的而Activity有界面,Service可以当应用退出Activity销毁的时候依然运行在手机后台中。以下介绍Service的使用。//创建ServicepublicclassMusicServiceextendsService{publicvoidonCreate(){super.onCreate();player=newMediaPlayer();//初始化MediaPlayer对象manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);//初始化NotificationManager对象}//Service同Activity类似,也是由系统创建对象的,所以需要定义在AndroidMainfest.xml文件声明定义:23 巢湖学院2013届本科毕业论文(设计)//重写onBind方法,这是能够与Activity交互的常用途径publicIBinderonBind(Intentarg0){returnnewMyBinder();}publicclassMyBinderextendsBinder{//Service的启动只会执行一次onCreate方法,当与Activity绑定,onBind方法得到调用,返回MyBinder对象,然后操作MyBinder对象去播放歌曲和显示通知栏。}//Service与Activity绑定privateMusicService.MyBinderbinder;//声明binder对象//创建一个ServiceConnection对象,当绑定和解绑Activity时作为参数传入privateServiceConnectionconn=newServiceConnection(){publicvoidonServiceDisconnected(ComponentNamename){}publicvoidonServiceConnected(ComponentNamename,IBinderservice){binder=(MusicService.MyBinder)service;//调用Service的onBind方法。//需要做一些处理,比如更新SeekBar的进度显示}};//启动并绑定服务if(null==binder){Intentintent=newIntent(this,MusicService.class);startService(intent);//启动MusicService服务bindService(intent,conn,BIND_AUTO_CREATE);//绑定服务,onServiceConnected得到调用,给binder对象赋值。}//停止绑定和停止服务unbindService(conn);//解除绑定Intentintent=newIntent(HomeActivity.this,MusicService.class);stopService(intent);//停止服务23 巢湖学院2013届本科毕业论文(设计)当服务启动并绑定好之后,就只需要操纵binder对象,所以在binder类中定义播放和控制的代码。下面说明歌曲的播放代码思路:player.reset();//播放歌曲前先前置player.setAudioStreamType(AudioManager.STREAM_MUSIC);//声音大小随手机的设置变化musicUri=Uri.parse(music.getMusic_path());//根据路径转换成URI对象player.setDataSource(MusicService.this,musicUri);//添加播放的歌曲player.prepare();//准备播放player.setOnPreparedListener(preparedListener);//当准备完毕后播放player.setOnCompletionListener(listener);//当播放完毕后处理其他逻辑代码,比如下一首播放OnPreparedListenerpreparedListener=newOnPreparedListener(){publicvoidonPrepared(MediaPlayermp){mp.start();//开始播放歌曲}};OnCompletionListenerlistener=newOnCompletionListener(){publicvoidonCompletion(MediaPlayermp){//下一首,还是单曲循环,等等逻辑代码的处理}};//播放其他操作player.pause();//暂停播放player.start();//暂停继续播放player.seekTo(progress);//改变播放歌曲的进度//关闭服务,必须释放MediaPlayer所占的资源if(player.isPlaying()){player.stop();//停止播放}player.release();//释放资源23 巢湖学院2013届本科毕业论文(设计)进度条的同步更新,使用了Handler,每隔1s中调用一次binder中所定义的获得SeekBar进度的方法。SeekBar进度的公式如下:seekProgress=player.getCurrentPosition()*100/musicLength;musicLength=player.getDuration();然后seekbar.setProgress(seekProgress);就同步更新进度条了。SeekBar注册OnSeekBarChangeListener监听器,重写的onStopTrackingTouch方法里,传入参数seekProgress,执行下面语句player.seekTo(seekProgress*musicLength/100);//通过binder对象调用当拖拽SeekBar就改变播放歌曲的进度。当歌曲播放完成后,只需要改变索引位置,放入新的Music对象的URI,重复执行播放歌曲的流程。第四章播放器运行测试为了方便截图演示,本次测试在480*800分辨率,Android2.2系统版本的模拟器下进行测试,测试效果如下:1.扫描歌曲效果图:图5-1为一键扫描效果图,图5-2为自定义扫描完成后的效果图,当歌曲很多情况下,是需要花费一定时间的,但不会让手机卡住。图5-1一键扫描完成23 巢湖学院2013届本科毕业论文(设计)图5-2自定义扫描完成2.扫描完成后,本地歌曲列表显示界面如图5-3所示。点击红心按钮,添加或者移除最爱歌曲,点击加号按钮,添加歌曲到播放列表中。图5-3本地歌曲列表3.播放歌曲显示的界面如图5-4所示,歌词同步显示,SeekBar同步更新进度,上下拖拽歌词,同步改变播放进度。拖拽SeekBar,改变播放进度和歌词显示。23 巢湖学院2013届本科毕业论文(设计)图5-4播放歌曲界面参考文献[1]李刚.疯狂Android讲义[M].北京:电子工业出版社,2011.[2]李刚.疯狂Java讲义[M].北京:电子工业出版社,2012.[3]吴亚峰.Android应用案例开发大全[M].北京:人民邮电出版社,2011.[4]苗忠良,宛斌,等.Android多媒体编程从初学到精通[M].北京:电子工业出版社,2011.[5]许正华.程序员的创新修炼[J].程序员,2012.05(5):82-85.[6]肖梓航.Android软件安全开发实践[J].程序员,2012-09(9):82-85.[7]王哲.Android敏捷开发指南[J].程序员,2012-09(9):86-89.[8]庄明浩.移动互联网创业路向何方?[J].程序员,2012-10(10):32-35.[9]AbelAvram.Android2.2新特性综述[EB/OL].[2010-05-31].http://www.infoq.com/cn/news/2010/05/Android-2.2.[10]gryphone.带ListView的音乐播放器[J/OL].[2010-01-23].http://www.iteye.com/topic/578134.23 巢湖学院2013届本科毕业论文(设计)23 巢湖学院2013届本科毕业论文(设计)致谢23 巢湖学院2013届本科毕业论文(设计)巢湖学院本科学生毕业论文(设计)指导教师评阅表内容包括:学生写作态度、科研作风,论文选题的理论意义和实践价值,论据是否充分、可靠,掌握基础理论、专门知识、研究方法和技能的水平,写作的逻辑性、技巧及其他优缺点。成绩:指导教师签名:       年  月  日 23 巢湖学院2013届本科毕业论文(设计)巢湖学院本科学生毕业论文(设计)综合评定意见表答辩委员会评定意见终评成绩:答辩委员会主席签名:       年  月  日院系意见院长(主任)签名:       年  月  日 23'