200602044011_张浩_第1页
200602044011_张浩_第2页
200602044011_张浩_第3页
200602044011_张浩_第4页
200602044011_张浩_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、单位代码 10642 密 级 公开 学 号200602044011重庆文理学院学士学位论文 基于Android平台多媒体播放器的设计与实现 论文作者: 张 浩指导教师: 王瑞胡学科专业: 计算机科学与技术 | 计算机科学与技术提交论文日期: 年 月 日 论文答辩日期: 年 月 日 学位授予单位:重庆文理学院 中 国 重 庆2010年4月计算机学院毕业论文(设计) 目录目 录1 Android体系结构分析11.1 引言11.2 Android体系结构介绍11.2.1应用程序11.2.2应用程序框架11.2.3库和运行环境11.3 Android应用程序组成21.3.1 Activity介绍21.

2、3.2 Broadcast Intent Receiver介绍21.3.3 Service介绍31.3.4 Content Provider介绍31.4 Android应用工程文件组成32 基于Android多媒体播放器设计52.1 多媒体播放器功能设计52.2 播放器详细设计52.2.1 多媒体播放器应用名称52.2.2多媒体播放器应用图标52.2.3播放列表设计52.2.4视频播放的设计72.2.5音乐播放的设计83 设计作品展示133.1作品截图展示133.1.1载有Android的模拟器133.1.2音乐和视频选择界面143.1.3播放列表143.1.4音乐播放界面153.1.5后台播

3、放音乐中163.1.6视频播放界面16I2006级 张 浩 毕业设计 基于Android平台多媒体播放器设计与实现计算机科学与技术 张 浩 指导教师 王瑞胡摘要: 播放多媒体的时候用户启动了其他Activity,这个时候程序要在后台继续播放;如检测SD卡上文件的变化;或者在后台记录用户的地理信息位置的改变等。此时则需要用到Android提供的Service,可以通过Activity来启动一个Service,系统也将保持这个Service一直运行。然后我们就可以把播放程序放到Service里面运行了,然后通过Activity来调用Service内控制MediaPlayer的方法来控制播放器,其中

4、传递参数由Intent进行。关键词: Android;多媒体;Intent;Activity;ServiceIIIAndroid platform media player based on the design and implementation -Android platform on the Analysis and DesignMajor: Computer Science and Technology Class: 1 Author: Zhang Hao Supervisor: Wang RuihuAbstract:When a user starts playing multim

5、edia other Activity, this time program to continue playing in the background; such as detecting changes in files on SD cards; or in the background and record the location of the users geographic information and changes. At this point you need to use Android to provide the Service, through the Activi

6、ty to start a Service, the system will remain the Service has been run. Then we can put the player inside the running of the Service, and then to call the Service Activity MediaPlayer within the control method to control the player, including passing parameters by the Intent toKeywords:Android ; Mul

7、timedia ;Intent;Activity;Service 1 Android体系结构分析1.1 引言Android是基于Linux内核的软件平台和操作系统,早期由Google开发,后由开放手机联盟Open Handset Alliance)开发。它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。低层以Linux内核工作为基础,只提供基本功能;其他的应用软件则由各公司自行开发,以Java作为编写程序的一部分。另外,为了推广此技术,Google和其它几十个手机公司建立了开放手机联盟。Android在未公开之前常被传闻为Google电话或GPhone。大

8、多传闻认为Google开发的是自己的手机电话产品,而不是一套软件平台。到了2010年1月,Google开始发表自家品牌手机电话的Nexus One。目前最好的是Android3.0。1.2 Android体系结构介绍1.2.1应用程序Android的应用程序通常涉及用户界面和用户交互,这类程序是用户实实在在能感受到的。Android的应用程序目前以Java语言进行编辑。Android本事提供了桌面、联系人、电话和浏览器等众多的核心应用。同时应用程序的开发者还可以使用应用程序框架层的API实现自己的程序,这也是Android开源的巨大潜力的体现。Android这种开放而强大的平台给每个程序开发者

9、提供了公平的机会,每一个开发者都可以加入移动互联的世界,共同推动移动互联的发展。1.2.2应用程序框架普通的开发者可以使用Android核心应用程序使用的系统API。Android种的应用开发框架设计的非常巧妙,通过这套应用框架,各种组件可以被用户的应用重复利用,各种服务也可以被各种应用重复利用。开发人员应该很好地理解这套框架的工作机制,这样才能开发出更好的应用程序。1.2.3库和运行环境Android包含了一些C/C+库,这些库能被Android系统中不同的组件使用。它们通过Android应用程序框架为开发者提供服务。以下是一些核心库。系统C库。一个从BSD继承来的标准C系统函数库(libc

10、),它是专门为基于嵌入式Linux的设备定制的。媒体库。基于PacketVideo OpenCORE,改库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4、H.264、MP3、AAC、AMR、JPG、PNG。Surface Manager。对显示子系统的管理,并且为多个应用程序提供了2D和3D图层的无缝融合。LibWebCore。一个最新的Web浏览器引擎,用来支持Android浏览器和一个可嵌入的Web视图。Android包括了一个核心库,该核心库提供了Java编程语言核心库的大多数功能。1.3 Android应用程序组成一般来说Android程序主要由下

11、列4部分组成,他们分别是:Activity、Broadcast Intent Receiver、Service、Content Provider。1.3.1 Activity介绍Activity是开发者遇到的最频繁的应用模块,也是Android当中最基本的模块之一,在Android的程序当中,Activity一般代表手机屏幕的一屏。在Activity当中,可以添加一些View,并且可以对这些View做一些事件的处理。一般一个Android应用是由多个Activity组成的,这多个Activity之间可以进行相互跳转。1.3.2 Broadcast Intent Receiver介绍可以使用Br

12、oadcast Receiver来让应用对一个外部的事件做出响应。这是非常有意思的,例如,当电话呼入这个外部事件的到来的时候,可以利用Broadcast Receiver进行处理。例如,当下载一个程序成功的完成的时候,任然可以利用Broadcast Receiver进行处理。Broadcast Receiver不能生产UI,也就是说对于用户来说不是透明的,用户是看不到的。Broadcast Receiver既可以在AndroidManifest.xml中注册,也可以在运行时的代码中使用Context.registerReceiver()进行注册。只要是注册了,当时间来临的时候,即使程序没有启动

13、,系统也在需要的时候启动程序。各种应用还可以通过使用Context.sendBroadcast()将它们自己的intent Broadcast广播给其他应用程序。1.3.3 Service介绍Service是一种程序,它可以运行很长的时间,但是它却没有用户界面。这么说有点枯燥,我们来看个例子。打开一个音乐播放器的程序,这个时候若想上网了,那么,我们打开Android的浏览器,这个时候虽然我们已经进入了浏览器这个程序,但是,歌曲的播放并没有停止,而是在后台继续一首接一首的播放。其实这个播放就是由播放音乐的Service进行控制。当然这个播放音乐的Service也可以停止,例如,当播放列表里面的歌

14、曲都结束,或者用户按下停止音乐播放的快捷键等。1.3.4 Content Provider介绍Android这个系统和其他的操作系统还不太一样,我们需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据,以及一些其他类型的数据。Content Provider就是用于两个程序之间的数据交换的。一个Content Provider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。也就是说,一个程序通过实现一个Content Provider的抽象接口将自己的数据暴露出去。外界根本看不到,也不用看到这个应用暴露

15、的数据在应用当中是如何存储的,即用数据库存储还是用文件存储,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准而统一的接口和程序里的数据打交道。可以读取程序的数据,也可以删除程序的数据,当然中间也会涉及一些权限问题。1.4 Android应用工程文件组成图一 项目结构l 源文件(包含Activity)。源文件都在上边的src目录中。l R.java文件。这个是Eclipse自动生成的,应用开发者不需要去修改里边的内容。里边内容的修改也是有Eclipse自动来处理的。R文件对于应用开发者来说基本没有什么用,但是对Android系统非常有用。在这个文件当中,Android对下边即将

16、介绍的资源进行了全局的索引。在下边介绍的res文件夹中,内容发生任何变化,R.java都会重新编译,同步更新的。l Android Library。这个是应用运行的Android库。图1显示项目用的是Android 2.0的库。l Assets 目录。在这个目录里边主要放置多媒体等一些文件。l Res目录。这个目录主要放置应用用到的资源文件。下边分3个目录进行存放。当这个目录当中的资源文件发生变化时,上面的R文件的内容就会自动发生变化。l Drawable目录。这里面主要放置应用到的图片资源。l Layout 目录。主要存放布局文件,这些布局文件都是些XML文件。l Values 目录。这个目

17、录里边主要放置字符串(string.xml)、颜色(color.xml)、数组(array.xml)。l AndroidManifest.xml这个文件相当重要,相当于应用的配置文件。在这个文件里边必须声明应用的名称,应用所用到的Action,Service,以及receiver等。 2 基于Android多媒体播放器设计 2.1 多媒体播放器功能设计l 播放列表(音乐、视频各个实现)l 视频播放(上一个、下一个、快进、快退、暂停、播放、进度条)l 音乐播放(上一曲、下一曲、暂停、播放、进度条、后台播放)2.2 播放器详细设计播放器具体的一些设计,应用的名称、图标的选择、UI设计、功能实现的核

18、心技术等。2.2.1 多媒体播放器应用名称本设计的应用名称叫MediaPlayer加上版本号。每次做出稍大改动就会升级一个版本,增加0.1。本次设计到1.1版。2.2.2多媒体播放器应用图标这个应用没有特意去找其他图标,就采用的代表Android机器人图标。图二 应用图标2.2.3播放列表设计首先声明一下这次播放列表的设计很简单,并没用到数据库SQLite。而是直接用到 IO的File。通过把多媒体文件放到模拟的SDCard里面对应的目录里面,打开应用选择void还是music传递参数得到对应的path 后取得音乐List或者视频List。播放列表的实现需要文件列表以及界面。这里有Androi

19、d提供的ListView这个类来实现。ListView是一个列表,列表一般都需要显示数据。ListView需要和ArrayAdapter进行绑定,然后把ArrayAdapter里面的数据显示出来,而ArrayAdapter是有3个参数进行构造的。第一个参数是Context,及上下文的引用;第二个参数为一个R文件里面定义的Layout,只不过这里用的是系统的R文件;第三个参数是一个数组,当然数组里边的每一项的类型没有限制。ArrayAdapter是ListAdapter的一个直接子类。它的作用就是一个数组和ListView之间的桥梁。他可以将数组里边定义的数据一一对应的显示在Listview里边

20、。通常由ArrayAdapter进行适配的ListView每一项通常只有一个TextView,而TextView里边显示的内容就是数字里边的对象调用toString()方法后生成字符串。以下是如何把一个文件list通过ListView形成一个播放列表的核心代码:protected void onStart() super.onStart();if (mFileNames.size() = 0) for (File file : mFiles) mFileNames.add(file.getName();/ 初始化mListViewmListView.setAdapter(new ArrayAd

21、apter(this,android.R.layout.simple_list_item_1, mFileNames.toArray(new String0);mListView.setItemsCanFocus(true);mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);mListView.setOnItemClickListener(this);Android的界面都是通过放在Layout里面的xml文件实现的,以下是播放列表界面的核心代码:2.2.4视频播放的设计视频播放是由Android提供的widget编程实现的,整个视频播放

22、窗口由widget下面的一个VideoView实现,给VideoView指定视频文件路径就可以直接调用start()方法开始播放视频。给VideoView设置一个MediaController就直接可以把播放控制的那些功能实现了。以下是视频播放的核心代码:protected void onCreate(Bundle savedInstanceState) / TODO Auto-generated method stubsuper.onCreate(savedInstanceState);this.setContentView(R.layout.player);this.getPath();t

23、his.play(path,name);toast = new Toast(this).makeText(this, 没有了, 1000);protected void play(String path,String name)vv = (VideoView) this.findViewById(R.id.vv);MediaController mc = new MediaController(this);mc.setPrevNextListeners(next, prev);vv.setMediaController(mc);vv.setVideoPath(path);vv.requestF

24、ocus();this.setTitle(当前: +name.substring(0, name.length() - 4);vv.start();以下是视频播放界面的xml代码:2.2.5音乐播放的设计音乐播放这个模块用了Android提供的MediaPlayer这个类。首先介绍一下MediaPlayer1) 如何获得MediaPlayer实例:可以使用直接new的方式: MediaPlayer mp = new MediaPlayer();也可以使用create的方式,如:MediaPlayer mp = MediaPlayer.create(this, R.raw.test);/这时就不

25、用调用setDataSource了2) 如何设置要播放的文件:MediaPlayer要播放的文件主要包括3个来源:a. 用户在应用中事先自带的resource资源例如:MediaPlayer.create(this, R.raw.test);b. 存储在SD卡或其他文件路径下的媒体文件例如:mp.setDataSource(/sdcard/test.mp3);c. 网络上的媒体文件例如:mp.setDataSource(MediaPlayer的setDataSource一共四个方法:setDataSource (String path) setDataSource (FileDescripto

26、r fd) setDataSource (Context context, Uri uri) setDataSource (FileDescriptor fd, long offset, long length)3)对播放器的主要控制方法:Android通过控制播放器的状态的方式来控制媒体文件的播放,其中:prepare()和prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。start()是真正启

27、动文件播放的方法,pause()和stop()比较简单,起到暂停和停止播放的作用,seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。reset()可以使播放器从Error状态中恢复过

28、来,重新会到Idle状态。4)设置播放器的监听器:MediaPlayer提供了一些设置不同监听器的方法来更好地对播放器的工作状态进行监听,以期及时处理各种情况,如:setOnCompletionListener(MediaPlayer.OnCompletionListener listener)、setOnErrorListener(MediaPlayer.OnErrorListener listener)等,设置播放器时需要考虑到播放器可能出现的情况设置好监听和处理逻辑,以保持播放器的健壮性。虽然有了这个类对音乐的播放算是解决了,也提供了start、stop、pause等方法。但是没有像Vi

29、deoView可以直接设置一个MediaController就可以把控制功能做好。每一个功能都是自己弄一个按钮添加事件监听器完成。然而这只是个小问题,这个音乐播放器的最大问题出现在后台播放上面,也就是要用到Service。这里介绍一下Service工作原理:Service,看名字就知道跟正常理解的“服务”差不多,后台运行,可交互这样的一个东西。它跟Activity的级别差不多,但是他不能自己运行,需要通过某一个Activity或者其他Context对象来调用, Context.startService() 和 Context.bindService()。两种启动Service的方式有所不同。这

30、里要说明一下的是如果你在Service的onCreate或者onStart做一些很耗时间的事情,最好在 Service里启动一个线程来完成,因为Service是跑在主线程中,会影响到你的UI操作或者阻塞主线程中的其他事情。Service的生命周期:Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。1 通过startService service会经历 onCreate - onStartstopService的时候直接onDestroy如果是调用者

31、(TestServiceHolder)自己直接退出而没有调用stopService的话,Service会一直在后台运行。下次TestServiceHolder再起来可以stopService。2 通过bindService Service只会运行onCreate, 这个时候 TestServiceHolder 和TestService绑定在一起TestServiceHolder 退出了,Srevice就会调用onUnbind-onDestroyed所谓绑定在一起就共存亡了。有了Service,我可以把MediaPlayer这个对象放到Service里面。通过用外部的Activity来调用放在S

32、ervice里MediaPlayer提供的方法来对音乐播放器进行控制。当程序处在播放界面的时候,Service要和前台界面上显示的东西要做到同步。以下是Activity中初始化界面时需要与Service连接的代码:private void init() button1 = (Button) findViewById(R.id.start);button1.setOnClickListener(startIt);button2 = (Button) findViewById(R.id.stop);button2.setOnClickListener(stopIt);button3 = (Butt

33、on) findViewById(R.id.prev);button3.setOnClickListener(prev);button4 = (Button) findViewById(R.id.next);button4.setOnClickListener(next);musicName = (TextView) this.findViewById(R.id.musicName);mSeekbar = (SeekBar) findViewById(R.id.seekBar);mShowNowTime = (TextView) findViewById(R.id.nowTime);mShow

34、AllTime = (TextView) findViewById(R.id.allTime);mSeekbar.setOnSeekBarChangeListener(listener_seek_bar);musicService.player.setOnPreparedListener(new OnPreparedListener() public void onPrepared(MediaPlayer mp) mTime = musicService.player.getDuration();mShowAllTime.setText(setTime(mTime);musicName.set

35、Text(musicService.getMusicName();mMaxProgress = mTime / 1000;mSeekbar.setMax(mMaxProgress);mSeekbar.setProgress(1);mHandler.removeMessages(MESSAGE);mHandler.sendMessage(mHandler.obtainMessage(MESSAGE);Log.e(PREPARED, setOnPreparedListener););if(musicService.isPlaying()int p = musicService.player.get

36、CurrentPosition()/1000;mTime = musicService.player.getDuration();mShowAllTime.setText(setTime(mTime);musicName.setText(musicService.getMusicName();mMaxProgress = mTime / 1000;mSeekbar.setMax(mMaxProgress);mSeekbar.setProgress(p);mHandler.sendMessage(mHandler.obtainMessage(MESSAGE);elsetrymusicServic

37、e.player.prepare();catch(Exception e)musicService.player.start();以下是Service中对MediaPlayer控制的核心代码:public void onStart(Intent intent, int startId) super.onStart(intent, startId);position = intent.getExtras().getInt(position);musicPath = mFiles.get(position).getPath();musicName = mFiles.get(position).ge

38、tName();if (isPlaying() reset();setPath();/ 设置文件路径public void setPath() try player.setDataSource(musicPath); catch (Exception e) e.printStackTrace();/ 播放 暂停public void playOrPause() Log.e(paly, playOrPause);if (isPlaying() player.pause(); else player.start();public void playNext() Log.e(paly, playNe

39、xt);if (position = -1) return;if (position = mFiles.size() - 1) musicName = none;return;musicPath = mFiles.get(+position).getPath();musicName = mFiles.get(position).getName();reset();setPath();play();public void playPrev() Log.e(paly, playPrev);if (position = -1) return;if (position = 0) musicName = none;return;musicPath = mFiles.get(-position).getPath();musicName = mFiles.get(position).getName();reset();setPath();play();public void play() try player.prepare(); catch (Exception e) e.printStackTrace();

温馨提示

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

评论

0/150

提交评论