音乐播放器设计文档_第1页
音乐播放器设计文档_第2页
音乐播放器设计文档_第3页
音乐播放器设计文档_第4页
音乐播放器设计文档_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

生产实习报告题目:音乐播放器学生姓名:张凡学号:201220220123班级:1222201专业:数字媒体技术指导教师:张金2015年08月08日目录TOC\o"1-4"\h\u6576一、引言 3241691.1项目背景 3168461.2项目研究的目的 4111071.3安卓简介 431246二.功能分析 5224612.1功能需求分析 5147822.2系统性能需求 6146582.3运行环境需求 610126三.程序详细设计 6249113.1主界面的设计 611643.2播放界面设计 11199693.3其他功能 1410768四.调试与运行 18140304.1调试 1839114.2运行结果 199585五.总结 21引言1.1项目背景当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,使得手机操作系统也出现了不同各类,现在的市场上主要有三个手机操作系统,symbian,Windowsmobile,以及谷歌的Android操作系统,其中占有开放源代码优势的Android系统有最大的发展前景。那么能否在手机上拥有自己编写的个性音乐播放器呢?答案是:肯定的,谷歌Android系统就能做到。本文的音乐播放器就是基于谷歌Android手机平台的播放器。随着计算机的广泛运用,手机市场的迅速发展,各种音频视频资源也在网上广为流传,这些资源看似平常,但已经渐渐成为人们生活中必不可少的一部分了。于是各种手机播放器也紧跟着发展起来,但是很多播放器一味追求外观花哨,功能庞大,对用户的手机造成了很多资源浪费,比如CPU,内存等的占用率过高,在用户需要多任务操作时,受到了不小的影响,带来了许多不便,而对于大多数普通用户,许多功能用不上,形同虚设。针对以上各种弊端,选择了开发多语种的音频视频播放器,将各种性能优化,继承播放器的常用功能,满足一般用户(如听歌,看电影)的需求,除了能播放常见格式的语音视频文件,高级功能:还能播放RMVB格式的视频文件。此外,还能支持中文、英文等语言界面。1.2项目研究的目的1.熟悉一下eclipse工具和安卓的环境配置及开发的过程;2.熟练掌握java的组件如button,textview,listView,menu等组件的灵活应用;3.熟练掌握安卓的一个关于数据保存的方式SQLite3;4.锻炼一下自己遇到问题,然后解决问题的能力。1.3安卓简介1.3.1Android特征1.提供访问硬件的API函数,简化像摄像头、GPS等硬件的访问过程具有自己的运行时和虚拟机2.提供丰富的界面控件供使用者之间调用,加快用户界面的开发速度,保证Android平台上程序界面的一致性3.提供轻量级的进程间通讯机制Intent,使跨进程组件通信和发送系统级广播成为可能4.提供了Service作为无用户界面,长时间后台运行的组件支持高效、快速的数据存储方式1.3.2Android应用程序框架提供Android平台基本的管理功能和组件重用机制:ActivityManager,管理应用程序的生命周期WindowsManager,启动应用程序的窗体ContentProvider,共享私有数据,实现跨进程的数据访问PackageManager,管理安装在Android系统内的应用程序TeleghonyManager,管理与拨打和接听电话的相关功能功能分析2.1功能需求分析根据项目的目标,我们可获得项目系统的基本需求,以下从不同角度来描述系统的需求,并且使用用例图来描述,系统的功能需求,我们分成四部分来概括,即播放器的基本控制需要,播放列表管理需求,播放器友好性需求和播放器扩展卡需求。下面图2-1是音乐播放器的基本用例图,描述了程序的基本功能2.2系统性能需求根据Android手机系统要求无响应时间为5秒,所以就有如下性能要求:当要求歌曲播放时,程序响应时间最长不能超过5秒当要求歌曲暂停时,程序响应时间最长不能超过5秒当要求歌曲停止时,程序响应时间最长不能超过5秒当要求歌曲上/下一首时,程序响应时间最长不能超过5秒(5)当要求进行清单列表时,程序响应时间最长不能超过5秒2.3运行环境需求操作系统:Android手机基于Linux操作系统支持环境:Android1.5-4.2.2版本开发环境:Eclipse3.5ADT21TOC\o"1-3"\h\u程序详细设计3.1主界面的设计主界面包含本地列表获取、我的收藏、在线音乐及正在播放等各个功能的切换。首先为我们出现的是音乐列表的获取。Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,并且提供了一套数据库表格,通过ContentProvider的方式提供给用户。当手机开机或者有SD卡插拔等事件发生时,系统将会自动扫描SD卡和手机内存上的媒体文件,如audio,video,图片等,将相应的信息放到定义好的数据库表格中。在这个程序中,我们不需要关心如何去扫描手机中的文件,只要了解如何查询和使用这些信息就可以了。MediaStore中定义了一系列的数据表格,通过ContentResolver提供的查询接口,我们可以得到各种需要的信息;其主要方法如下:创建ArrayList<>存储音乐列表;用Cursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder);来获取手机上的音乐;用MediaStore.Audio.Media.XXX(XXX可以是ALBUM,SIZE,DURATION等信息)来获取音乐相关信息;生成音乐列表。关键代码:publicclassMusicList{ publicstaticArrayList<Music>getMusicData(Contextcontext){ ArrayList<Music>musicList=newArrayList<Music>(); ContentResolvercr=context.getContentResolver(); if(cr!=null){ //获取所有歌曲 Cursorcursor=cr.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,MediaStore.Audio.Media.DEFAULT_SORT_ORDER); if(null==cursor){ returnnull; } if(cursor.moveToFirst()){ do{ Musicm=newMusic(); Stringtitle=cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.TITLE)); Stringsinger=cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.ARTIST)); if("<unknown>".equals(singer)){ singer="未知艺术家"; } Stringalbum=cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.ALBUM)); longsize=cursor.getLong(cursor .getColumnIndex(MediaStore.Audio.Media.SIZE)); longtime=cursor.getLong(cursor .getColumnIndex(MediaStore.Audio.Media.DURATION)); Stringurl=cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.DATA)); Stringname=cursor .getString(cursor .getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); Stringsbr=name.substring(name.length()-3, name.length()); if(sbr.equals("mp3")){ m.setTitle(title); m.setSinger(singer); m.setAlbum(album); m.setSize(size); m.setTime(time); m.setUrl(url); m.setName(name); musicList.add(m); } }while(cursor.moveToNext()); } if(cursor!=null){ cursor.close(); } } returnmusicList; }}主界面的模拟器效果图3.2播放界面设计播放界面是播放器的核心所在,它需要实现播放器的其本功能(播放、暂停、上一曲、下一曲、声音控制、播放方式等)。首先,我们需要实现其播放/暂停功能。privatevoidplay(){if(mp!=null){mp.start();}flag=1;}//播放歌曲privatevoidpause(){if(mp!=null){mp.pause();}flag=1;}//暂停歌曲上/下一曲功能的实现:privatevoidlastOne(){ShowNotifcation();if(_ids.length==1){position=position;}elseif(position==0){position=_ids.length-1;}elseif(position>0){position--;}//上一曲privatevoidnextOne(){ShowNotifcation();if(_ids.length==1||PlayMusicActivity.loop_flag==PlayMusicActivity.LOOP_ONE){position=position;}elseif(PlayMusicActivity.loop_flag==PlayMusicActivity.LOOP_ALL){if(PlayMusicActivity.random_flag==true){//获得随机位置inti=getRandomPostion(true);if(i==-1){stop();return;}else{position=i;}}else{if(position==_ids.length-1){position=0;}elseif(position<_ids.length-1){position++;}}}elseif(PlayMusicActivity.loop_flag==PlayMusicActivity.LOOP_NONE){if(PlayMusicActivity.random_flag==true){//inti=getRandomPostion(false);if(i==-1){stop();return;}else{position=i;}}else{if(position==_ids.length-1){stop();return;}elseif(position<_ids.length-1){position++;}}}//下一首接着就是声音的控制,声音的控制是通过一根进度条来实现,其主要代码如下:privateOnSeekBarChangeListenerseekBarChangeListener=newOnSeekBarChangeListener(){@OverridepublicvoidonProgressChanged(SeekBarseekBar,intprogress,booleanfromUser){if(seekBar.getId()==R.id.sb_player_voice){//设置音量am.setStreamVolume(AudioManager.STREAM_MUSIC,progress,0);}}@OverridepublicvoidonStartTrackingTouch(SeekBararg0){}@OverridepublicvoidonStopTrackingTouch(SeekBararg0){}最后,要实现播放方式,主要有两种方式,随即和顺序。3.3其他功能事件监听的部分代码:privatevoidinitComponent(){ ib_play=(ImageButton)findViewById(R.id.play); ib_pause=(ImageButton)findViewById(R.id.pause); ib_stop=(ImageButton)findViewById(R.id.stop); ib_fileList=(ImageButton)findViewById(R.id.file_list); ib_prev=(ImageButton)findViewById(R.id.prev); ib_next=(ImageButton)findViewById(R.id.next); ib_volumeAdd=(ImageButton)findViewById(R.id.volume_add); ib_volumeSub=(ImageButton)findViewById(R.id.volume_sub); onClickListener=newOnClickListener(); ib_play.setOnClickListener(onClickListener); ib_pause.setOnClickListener(onClickListener); ib_stop.setOnClickListener(onClickListener); ib_fileList.setOnClickListener(onClickListener); ib_prev.setOnClickListener(onClickListener); ib_next.setOnClickListener(onClickListener); ib_volumeAdd.setOnClickListener(onClickListener); ib_volumeSub.setOnClickListener(onClickListener); }界面背景实现://调用背景图片<?xmlversion="1.0"encoding="utf-8"?><bitmapxmlns:android="/apk/res/android"android:src="@drawable/beijing"></bitmap>//定义图片大小,位置,调用图片<ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_centerHorizontal="true"android:contentDescription="@string/hello_world"android:src="@drawable/ic_launcher1"/>获取皮肤Id **/ publicintgetCurrentSkinId(){ intskinIndex=settingPreference.getInt(KEY_SKINID,0); if(skinIndex>=SKIN_RESOURCES.length){ skinIndex=0; } returnskinIndex; } /** *设置皮肤资源ID **/ publicvoidsetCurrentSkinResId(intskinIndex){ Editorit=settingPreference.edit(); it.putInt(KEY_SKINID,skinIndex); mit(); }设置正常模式和夜间模式 **/ publicvoidsetBrightness(Viewv){Settingsetting=newSetting(this,true); Stringbrightness=setting.getValue(Setting.KEY_BRIGHTNESS); MenuAdapter.ViewHolderviewHolder=(MenuAdapter.ViewHolder)v.getTag(); WindowManager.LayoutParamsattributes=getWindow().getAttributes(); if(brightness!=null&&brightness.equals("0")){//夜间模式 viewHolder.tv_title.setText(getResources().getString(R.string.darkness_title)); viewHolder.btn_menu.setBackgroundResource(R.drawable.btn_menu_darkness); attributes.screenBrightness=brightnesslevel; setting.setValue(Setting.KEY_BRIGHTNESS,"1"); getWindow().setAttributes(attributes); }else{//正常模式 viewHolder.tv_title.setText(getReso

温馨提示

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

评论

0/150

提交评论