本文介绍MediaPlayer的使用。MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用MediaPlayer,要视情况选择了。MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView。SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库。

先贴出本文程序运行结果的截图,上面是播放/停止音频,可用SeekBar来调进度,下面是播放/停止视频,也是用SeekBar来调进度:

main.xml的源码:

XML/HTML代码
  1. <linearlayout android:id="@+id/LinearLayout01"
  2. android:layout_width="fill_parent" android:layout_height="fill_parent"
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:orientation="vertical">
  5. <seekbar android:id="@+id/SeekBar01" android:layout_height="wrap_content"
  6. android:layout_width="fill_parent">
  7. <linearlayout android:id="@+id/LinearLayout02"
  8. android:layout_width="wrap_content" android:layout_height="wrap_content">
  9. <button android:id="@+id/Button01" android:layout_width="wrap_content"
  10. android:layout_height="wrap_content" android:text="播放音频">
  11. <button android:id="@+id/Button02" android:layout_width="wrap_content"
  12. android:layout_height="wrap_content" android:text="停止播放">
  13. <seekbar android:id="@+id/SeekBar02" android:layout_height="wrap_content"
  14. android:layout_width="fill_parent">
  15. <surfaceview android:id="@+id/SurfaceView01"
  16. android:layout_width="fill_parent" android:layout_height="250px">
  17. <linearlayout android:id="@+id/LinearLayout02"
  18. android:layout_width="wrap_content" android:layout_height="wrap_content">
  19. <button android:layout_width="wrap_content"
  20. android:layout_height="wrap_content" android:id="@+id/Button03"
  21. android:text="播放视频">
  22. <button android:layout_width="wrap_content"
  23. android:layout_height="wrap_content" android:text="停止播放" android:id="@+id/Button04">

本文程序的源码,有点长:

Java代码
  1. package com.testMedia;
  2. import java.io.IOException;
  3. import java.util.Timer;
  4. import java.util.TimerTask;
  5. import android.app.Activity;
  6. import android.media.AudioManager;
  7. import android.media.MediaPlayer;
  8. import android.os.Bundle;
  9. import android.view.SurfaceHolder;
  10. import android.view.SurfaceView;
  11. import android.view.View;
  12. import android.widget.Button;
  13. import android.widget.SeekBar;
  14. import android.widget.Toast;
  15. public class testMedia extends Activity {
  16. /** Called when the activity is first created. */
  17. private SeekBar skb_audio=null;
  18. private Button btn_start_audio = null;
  19. private Button btn_stop_audio = null;
  20. private SeekBar skb_video=null;
  21. private Button btn_start_video = null;
  22. private Button btn_stop_video = null;
  23. private SurfaceView surfaceView;
  24. private SurfaceHolder surfaceHolder;
  25. private MediaPlayer m = null;
  26. private Timer mTimer;
  27. private TimerTask mTimerTask;
  28. private boolean isChanging=false;//互斥变量,防止定时器与SeekBar拖动时进度冲突
  29. @Override
  30. public void onCreate(Bundle savedInstanceState) {
  31. super.onCreate(savedInstanceState);
  32. setContentView(R.layout.main);
  33. //----------Media控件设置---------//
  34. m=new MediaPlayer();
  35. //播放结束之后弹出提示
  36. m.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
  37. @Override
  38. public void onCompletion(MediaPlayer arg0) {
  39. Toast.makeText(testMedia.this, "结束", 1000).show();
  40. m.release();
  41. }
  42. });
  43. //----------定时器记录播放进度---------//
  44. mTimer = new Timer();
  45. mTimerTask = new TimerTask() {
  46. @Override
  47. public void run() {
  48. if(isChanging==true)
  49. return;
  50. if(m.getVideoHeight()==0)
  51. skb_audio.setProgress(m.getCurrentPosition());
  52. else
  53. skb_video.setProgress(m.getCurrentPosition());
  54. }
  55. };
  56. mTimer.schedule(mTimerTask, 0, 10);
  57. btn_start_audio = (Button) this.findViewById(R.id.Button01);
  58. btn_stop_audio = (Button) this.findViewById(R.id.Button02);
  59. btn_start_audio.setOnClickListener(new ClickEvent());
  60. btn_stop_audio.setOnClickListener(new ClickEvent());
  61. skb_audio=(SeekBar)this.findViewById(R.id.SeekBar01);
  62. skb_audio.setOnSeekBarChangeListener(new SeekBarChangeEvent());
  63. btn_start_video = (Button) this.findViewById(R.id.Button03);
  64. btn_stop_video = (Button) this.findViewById(R.id.Button04);
  65. btn_start_video.setOnClickListener(new ClickEvent());
  66. btn_stop_video.setOnClickListener(new ClickEvent());
  67. skb_video=(SeekBar)this.findViewById(R.id.SeekBar02);
  68. skb_video.setOnSeekBarChangeListener(new SeekBarChangeEvent());
  69. surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);
  70. surfaceHolder = surfaceView.getHolder();
  71. surfaceHolder.setFixedSize(100, 100);
  72. surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  73. }
  74. /*
  75. * 按键事件处理
  76. */
  77. class ClickEvent implements View.OnClickListener{
  78. @Override
  79. public void onClick(View v) {
  80. if(v==btn_start_audio)
  81. {
  82. m.reset();//恢复到未初始化的状态
  83. m=MediaPlayer.create(testMedia.this, R.raw.big);//读取音频
  84. skb_audio.setMax(m.getDuration());//设置SeekBar的长度
  85. try {
  86. m.prepare();        //准备
  87. } catch (IllegalStateException e) {
  88. // TODO Auto-generated catch block
  89. e.printStackTrace();
  90. } catch (IOException e) {
  91. // TODO Auto-generated catch block
  92. e.printStackTrace();
  93. }
  94. m.start();        //播放
  95. }
  96. else if(v==btn_stop_audio || v==btn_stop_video)
  97. {
  98. m.stop();
  99. }
  100. else if(v==btn_start_video)
  101. {
  102. m.reset();//恢复到未初始化的状态
  103. m=MediaPlayer.create(testMedia.this, R.raw.test);//读取视频
  104. skb_video.setMax(m.getDuration());//设置SeekBar的长度
  105. m.setAudioStreamType(AudioManager.STREAM_MUSIC);
  106. m.setDisplay(surfaceHolder);//设置屏幕
  107. try {
  108. m.prepare();
  109. } catch (IllegalArgumentException e) {
  110. // TODO Auto-generated catch block
  111. e.printStackTrace();
  112. } catch (IllegalStateException e) {
  113. // TODO Auto-generated catch block
  114. e.printStackTrace();
  115. } catch (IOException e) {
  116. // TODO Auto-generated catch block
  117. e.printStackTrace();
  118. }
  119. m.start();
  120. }
  121. }
  122. }
  123. /*
  124. * SeekBar进度改变事件
  125. */
  126. class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener{
  127. @Override
  128. public void onProgressChanged(SeekBar seekBar, int progress,
  129. boolean fromUser) {
  130. // TODO Auto-generated method stub
  131. }
  132. @Override
  133. public void onStartTrackingTouch(SeekBar seekBar) {
  134. isChanging=true;
  135. }
  136. @Override
  137. public void onStopTrackingTouch(SeekBar seekBar) {
  138. m.seekTo(seekBar.getProgress());
  139. isChanging=false;
  140. }
  141. }
  142. }

MediaPlayer开发全解析的更多相关文章

  1. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

    C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

  2. 热度3年猛增20倍,Serverless&云开发的技术架构全解析

    『 作为一个不断发展的新兴技术, Serverless 热度的制高点已然到来.』 或许,Google Trends 所显示的 3 年猛增 20 倍的" Serverless " 搜 ...

  3. 【凯子哥带你学Framework】Activity界面显示全解析

    前几天凯子哥写的Framework层的解析文章<Activity启动过程全解析>,反响还不错,这说明“写让大家都能看懂的Framework解析文章”的思想是基本正确的. 我个人觉得,深入分 ...

  4. jQuery&nbsp;Ajax&nbsp;实例&nbsp;全解析

    jQuery Ajax 实例 全解析 jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我 ...

  5. ARM内核全解析,从ARM7,ARM9到Cortex-A7,A8,A9,A12,A15到Cortex-A53,A57

    转自: ARM内核全解析,从ARM7,ARM9到Cortex-A7,A8,A9,A12,A15到Cortex-A53,A57 前不久ARM正式宣布推出新款ARMv8架构的Cortex-A50处理器系列 ...

  6. jQuery Ajax 全解析

    转自:http://www.cnblogs.com/qleelulu/archive/2008/04/21/1163021.html 本文地址: jQuery Ajax 全解析 本文作者:QLeelu ...

  7. Oracle AWR报告指标全解析-11011552

    1-5 Top 5 Timed EventsWaits : 该等待事件发生的次数, 对于DB CPU此项不可用Times : 该等待事件消耗的总计时间,单位为秒, 对于DB CPU 而言是前台进程所消 ...

  8. Git全解析之远程仓库交互

    文章目录 1. Git全解析之远程仓库交互 1.1. 中央仓库的概念 1.2. 本地分支与远程分支 1.3. pull与fetch 1.4. 关于捐赠 Git全解析之远程仓库交互 中央仓库的概念 虽然 ...

  9. MySQL慢日志查询全解析:从参数、配置到分析工具【转】

    转自: MySQL慢日志查询全解析:从参数.配置到分析工具 - MySQL - DBAplus社群——围绕数据库.大数据.PaaS云,运维圈最专注围绕“数据”的学习交流和专业社群http://dbap ...

随机推荐

  1. ASP.NET缓存策略经验谈

    要提升ASP.NET应用程序的性能,最简单.最有效的方式就是使用内建的缓存引擎.虽然也能构建自己的缓存,但由于缓存引擎已提供了如此多的功能,所以完全不必如此麻烦.在很大程度上,ASP.NET开发者在W ...

  2. visual studio 2013 配置 ef+pgsql

    环境:VS2013,WIN7 准备工作: 1.有哪些供应商提供EF6的支持? 可以看msdn给出的答案:Which providers are available for EF6? 在本文使用 Dev ...

  3. UE 使用技巧

    一.关于正则表达式的使用 删除空行: 替换 %[ ^t]++^p 为 空串 替换回车换行符:替换^p 为 空串 删除行尾空格: 替换 [ ^t]+$ 为 空串 删除行首空格: 替换 %[ ^t]+ 为 ...

  4. 我喜欢的乐队-Euphoria

    来自日本的后摇乐团,001年冬天由森川裕之.佐藤昭太.木下阳辅三人于东京组建,2003年签约日本独立厂牌123Record,并发行首张EP细碟<Floral Dew>.包括EP.Singl ...

  5. MFC记住上次路径---遇到的一些问题

    今天完成一个需求,就是记住用户选择的文件路径,先是熟悉代码,然后在网上找解决方法,一开始感觉没什么,网上的方法差不多,应该很容易做出来,结果真是卡了一半天,到晚上自己才慢慢的搞清楚了. 遇到的问题真不 ...

  6. CentOS安装XRDP实现远程桌面访问

    1.配置环境: yum install gcc pam-devel openssl-devel -y 2.进入指定目录下载并解压xrdp: 先安装 wget; sudo yum -y install ...

  7. Apache Spark Streaming的优点

    Apache Spark Streaming的优点: (1)优势及特点 1)多范式数据分析管道:能和 Spark 生态系统其他组件融合,实现交互查询和机器学习等多范式组合处理. 2)扩展性:可以运行在 ...

  8. cocos2d-x 3.0 创建工程的模板

    将下面的代码拷贝到文本文件中,重命名文件为 cocos3.0创建工程.bat @echo off echo -------------------------create project with p ...

  9. 利用red5搭建一个简单的流媒体直播系统

    http://blog.sina.com.cn/s/blog_51396f890102exmz.html 一.red5安装.设置. 这个过程就不多说了,参见http://blog.csdn.net/l ...

  10. uva 796 Critical Links(无向图求桥)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...