版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学校代码:10128学校代码:10128学号:200920201076嵌入式系统综合设计说明书题目:基于Android的音乐播放器设计与实现姓名:学院:信息工程学院班级:指导教师:2012年9月24日摘要Android是一种以Linux为基础的开放源代码操作系统,本文就android平台下设计和实现音乐播放器,利用java语言和Eclipse编程工具实现。通过设计能够实现音乐的播放、暂停、上一曲、下一曲、音乐列表、声音控制、帮助菜单等功能,通过对基于android平台下的播放器的设计,了解音乐播放器的设计的原理和实现的相关技术,掌握了android编程思想以及基本的应用组件,对以后从事android开发有很大的帮助。关键词:android;音乐播放器;嵌入式;java第一章总体功能介绍1.1功能介绍设计的音乐播放器是基于android平台下的,能够实现音乐的播放、暂停、快进、快退、上一曲、下一曲、声音控制、播放列表,播放时间以及播放列表。通过播放列表,用户可以选择播放的音乐,播放器也可以显示该音乐的歌曲名、专辑、歌手以及歌曲的播放总时间,播放进度等歌曲的相关功能;用户还可以通过音乐增减按钮调节声音大小,还可以选择循环播放和顺序播放;该音乐播放器能够将将sd卡中的MP3格式的音乐文件进行查找和播放;用户可以通过系统帮助退出系统、更新播放列表、设置、帮助等功能。1.11各功能模块图AAndroid音乐播放器声音控制上一曲\下一曲音乐文件播放列表播放\暂停图1.11音乐播放器模块图1.12设计思想图1.12搭建模拟器图1.2系统结构用例图根据音乐播放器的功能设计,UML用例图更直观的反映了用户对该软件的需求,通过用例特征的分析,又用例模型抽象出该软件为用户的功能,以及详细的叙述,音乐播放器系统的用例图如下:图1.2音乐播放器功能用例图图1.21音乐播放器播放列表功能用例图第二章详细设计及功能实现2.1播放器界面的设计先实现播放页面的(包括各种控制按钮和专辑图片)布局代码main.xml以及播放列表的界面设计playlist.xml文件。图2.1播放界面和播放列表界面其中播放按钮、暂停、上一曲、下一曲、声音按钮采用xml文件,在按下和得到焦点的时候会做相应的改变,关键代码如下:<selectorxmlns:android="/apk/res/android"><itemandroid:state_focused="true"android:drawable="@drawable/desktop_music_voice2"/><itemandroid:state_selected="true"android:drawable="@drawable/desktop_music_voice2"/><itemandroid:state_pressed="true"android:drawable="@drawable/desktop_music_voice2"/><itemandroid:drawable="@drawable/desktop_music_voice"/></selector>2.2播放动画的设计有两个动画文件log.xml和log_two.xml文件,当动画结束时启动另外一个activity动画特效是两个imageView同时采用淡入,旋转和,缩放的特效其调入动画关键代码为:Animationanimation=AnimationUtils.loadAnimation(Logo.this,R.anim.logo);Animationanimation2=AnimationUtils.loadAnimation(Logo.this,R.anim.logo_two);图2.2播放动画界面2.3各模块详细设计音乐播放器包括声音控制模块,上一曲\下一曲,播放,暂停,播放列表,系统帮助等几个模块。2.31声音控制模块声音有两个按钮控制,一个增加声音和一个减少声音。通过这两个按钮用户可以调节播放音乐的声音大小,使用AudioManager组件对声音的大小进行增减,最大为7,最小为0。当用户点击声音按钮时,若是增按钮,对声音进行增加;若是减按钮对声音进行减小。图2.31声音控制图关键代码如下:获取点击事件voiceUp=(ImageButton)findViewById(R.id.music_voic_up);//音量增加voiceDown=(ImageButton)findViewById(R.id.music_voic_down);//音量增减小执行事件audiomanage=(AudioManager)getSystemService(Context.AUDIO_SERVICE); voiceDown.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub audiomanage.adjustVolume(AudioManager.ADJUST_LOWER,0); volume=audiomanage.getStreamVolume(AudioManager.STREAM_RING); if(volume>0){ volume--; audiomanage.setRingerMode(volume); } } });//声音控制按钮,声音增加 voiceUp.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub audiomanage.adjustVolume(AudioManager.ADJUST_RAISE,0); volume=audiomanage.getStreamVolume(AudioManager.STREAM_RING); if(volume<7){ volume++; audiomanage.setRingerMode(volume); } } });声音控制的程序流程图:图2.311声音控制流程图2.32播放暂停模块当用户点击播放\暂停按钮时,播放器就对当前播放事件监听,从而控制当前音乐的播放\暂停,其界面图如图2.31所示,关键代码如下://播放按钮playPauseBtn.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ intcmd=0; Intenti=newIntent(MusicService.MUSIC_CONTROL); //判断当前的状态值是什么状态如果是播放状态 if(status==MusicService.STATUS_PLAYING){ cmd=MusicService.CMD_PAUSE;//发送暂停的命令 }elseif(status==MusicService.STATUS_STOPPED){ cmd=MusicService.CMD_START;//发送播放的命令 }else{ cmd=MusicService.CMD_RESUME;//继续播放的命令 } i.putExtra("cmd",cmd);//将命令广播出去 sendBroadcast(i);//发送广播 }});2.34上一曲\下一曲模块当用户点击上一曲\下一曲按钮时,播放器就对当前播放事件监听,从音乐列表中转换音乐,从而控制当前音乐的上一曲\下一曲,其界面图如图2.31所示,关键代码如下://上一曲键事件监听器 previousbtn.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ Intenti=newIntent(MusicService.MUSIC_CONTROL); intcmd=MusicService.CMD_PREV;//发送前一首的命令 i.putExtra("cmd",cmd); sendBroadcast(i); } }); //下一曲键事件监听器 nextBtn.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ Intenti=newIntent(MusicService.MUSIC_CONTROL); intcmd=MusicService.CMD_NEXT; i.putExtra("cmd",cmd); sendBroadcast(i); } }); //设置SeekBar的监听事件 sb.setOnSeekBarChangeListener(newOnSeekBarChangeListener(){ //当停止拖动时调用的方法 publicvoidonStopTrackingTouch(SeekBarseekBar){ } publicvoidonStartTrackingTouch(SeekBarseekBar){ } //当SeekBar拖动时会执行此方法 publicvoidonProgressChanged(SeekBarseekBar,intprog, booleanfromUser){//fromUser参数意思是判断拖动是否是用户用手拖动的 if(fromUser==true&&Math.abs(prog-progress)>=5){ progress=prog; Intenti=newIntent(MusicService.MUSIC_CONTROL); intcmd=MusicService.CMD_SEEK;//发送拖动的命令 i.putExtra("cmd",cmd); i.putExtra("progress",progress);//讲拖动的进度传进Service sendBroadcast(i); sb.setProgress(progress); } } });}2.34音乐播放列表模块音乐播放列表由activity组件是实现,能够对当前android手机模拟器sd卡中MP3音乐文件进行读取和显示,包括歌曲名、专辑、歌曲时间以及歌手名。用户可以选择想要播放的音乐对其播放。其关键代码如下:privateList<Map<String,Object>>getMultiData(){ List<Map<String,Object>>musicList=newArrayList<Map<String,Object>>(); System.out.println(musicList+"0"); //循环找出所有的歌曲和信息 ContentResolverresolver=this.getContentResolver(); CursormusicCursor=resolver.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,null); intmusicColumnIndex; //遍历游标内容 if(null!=musicCursor&&musicCursor.getCount()>0){ for(musicCursor.moveToFirst();!musicCursor.isAfterLast();musicCursor.moveToNext()){ Map<String,Object>musicDataMap=newHashMap<String,Object>();//取得音乐的名字 musicColumnIndex=musicCursor .getColumnIndex(MediaStore.Audio.AudioColumns.TITLE); musicName=musicCursor.getString(musicColumnIndex); musicDataMap.put("musicName",musicName); musicColumnIndex=musicCursor .getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM); musicAlbum=musicCursor.getString(musicColumnIndex); musicDataMap.put("musicAlbum",musicAlbum); musicColumnIndex=musicCursor .getColumnIndex(MediaStore.Audio.AudioColumns.ARTIST); musicArtist=musicCursor.getString(musicColumnIndex); musicDataMap.put("musicArtist",musicArtist); musicColumnIndex=musicCursor .getColumnIndex(MediaStore.Audio.AudioColumns.DURATION); musicDuration=musicCursor.getString(musicColumnIndex); musicDataMap.put("musicdurction",musicDuration); //取得歌曲对应的专辑Key这里由于专辑图片太占内存就不在播放列表上显示了 musicColumnIndex=musicCursor .getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM_KEY); musicAlbumKey=musicCursor.getString(musicColumnIndex); String[]argArr={musicAlbumKey}; ContentResolveralbumResolver=this.getContentResolver(); CursoralbumCursor=albumResolver.query( MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,null, MediaStore.Audio.AudioColumns.ALBUM_KEY+"=?", argArr,null); if(null!=albumCursor&&albumCursor.getCount()>0){ albumCursor.moveToFirst(); intalbumArtIndex=albumCursor .getColumnIndex(MediaStore.Audio.AlbumColumns.ALBUM_ART); musicAlbumArtPath=albumCursor.getString(albumArtIndex); if(null!=musicAlbumArtPath){ musicDataMap .put("musicAlbumArtPath",musicAlbumArtPath); }else{ musicDataMap.put("musicAlbumArtPath",R.drawable.icon); } }else{ musicDataMap.put("musicAlbumArtPath",R.drawable.icon); } albumCursor.close(); musicList.add(musicDataMap); } musicCursor.close(); } returnmusicList; }音乐列表截图如下:图2.34音乐播放器列表2.35系统帮助模块系统帮助主要为用户提供使用软件的帮助功能,包括设置、帮助、列表、退出、刷新曲库等功能。其截图如下:图2.35系统帮助模块关键代码如下:publicbooleanonCreateOptionsMenu(Menumenu){ menu.add(Menu.NONE,Menu.FIRST+1,5,"刷新曲库").setIcon( android.R.drawable.ic_menu_search); menu.add(Menu.NONE,Menu.FIRST+2,6,"退出").setIcon( android.R.drawable.ic_menu_set_as); menu.add(Menu.NONE,Menu.FIRST+3,2,"帮助").setIcon( android.R.drawable.ic_menu_help); menu.add(Menu.NONE,Menu.FIRST+4,1,"列表").setIcon( android.R.drawable.ic_menu_agenda); menu.add(Menu.NONE,Menu.FIRST+5,4,"关于").setIcon( android.R.drawable.ic_menu_info_details); menu.add(Menu.NONE,Menu.FIRST+6,3,"设置").setIcon( android.R.drawable.ic_menu_preferences); returnsuper.onCreateOptionsMenu(menu); } @Override publicbooleanonOptionsItemSelected(MenuItemitem){ switch(item.getItemId()){ //这里的Menu.FIRST是一个常量Id的标示 //根据得到的ID判断当前那个菜单项被点中 caseMenu.FIRST+1: Toast.makeText(this,"正在刷新歌曲...",Toast.LENGTH_SHORT).show(); break; caseMenu.FIRST+2: finish(); Toast.makeText(this,"退出...",Toast.LENGTH_SHORT).show(); break; caseMenu.FIRST+3: Toast.makeText(this,"此功能暂未开放",Toast.LENGTH_SHORT).show(); break; caseMenu.FIRST+4://跳转到播放列表 IntentsetIntent=newIntent(PlayActivity.this,Musiclist.class); PlayActivity.this.startActivity(setIntent); break; caseMenu.FIRST+5: Stringshowtxt="帮助文件丢失!"; InputStreamis; try{ is=getAssets().open("readme.txt"); intsize=is.available(); byte[]buffer=newbyte[size]; is.read(buffer); is.close(); showtxt=newString(buffer,"utf-8"); }catch(IOExceptione){ thrownewRuntimeException(e); } newCustomDialog(PlayActivity.this,CustomDialog.DIALOG_DETAILS, "关于",showtxt).show(); break; caseMenu.FIRST+6: Toast.makeText(this,"此功能暂未开放",Toast.LENGTH_SHORT).show(); break; } returnfalse; }第三章调试及运行结果3.1实验测试问题实验主要读错误提示进行调试,在课设中主要出现的错误时“系统异常,强制终止”如下图所示图3.1异常终止3.2实验调试大多数时间出现如上所示的情况,这是我们需要对LogCat查看错误,课设中曾经常出现的是内存空间已满,需要释放进程空间,以导致出现程序运行时出现图3.1所示的现象,所以,当出现错误时,我们必须查看错在哪儿,然后改
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年收费的生产服务项目建议书
- 小学一年级简短游记作文10篇
- 一年级小学生新学期日记11篇
- Tetrasul-Standard-生命科学试剂-MCE
- Unit 6 Section B 训练题 人教版八年级上册英语
- 四年级语文楚才杯我不信7
- 2025届高考地理一轮复习练习40世界主要国家含解析新人教版
- 2024年钡氧化物合作协议书
- 2023届新高考新教材化学人教版一轮训练-第九章第4讲 生物大分子
- 玉溪师范学院《电磁学》2021-2022学年期末试卷
- 清洗效果监测方法--ppt课件
- 高压氧舱安装施工方案
- 中药提取车间自动化系统验证
- 老挝10大经济特区
- 模具设计评审表(开发前)
- 市政工程变更流程资料表格附件
- 周围血管和淋巴管疾病(PPT)
- 房地产客户信息登记表
- 小学音乐祖国祖国我们爱你课件ppt课件
- 郭维淮平乐正骨
- 课程设计——夹套反应釜
评论
0/150
提交评论