Android提高21篇之一:MediaPlayer
本文介绍MediaPlayer的使用。MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用MediaPlayer,要视情况选择了。MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView。SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库。
先贴出本文程序运行结果的截图,上面是播放/停止音频,可用SeekBar来调进度,下面是播放/停止视频,也是用SeekBar来调进度:

main.xml的源码:
- <linearlayout android:id="@+id/LinearLayout01"
- android:layout_width="fill_parent" android:layout_height="fill_parent"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical">
- <seekbar android:id="@+id/SeekBar01" android:layout_height="wrap_content"
- android:layout_width="fill_parent">
- <linearlayout android:id="@+id/LinearLayout02"
- android:layout_width="wrap_content" android:layout_height="wrap_content">
- <button android:id="@+id/Button01" android:layout_width="wrap_content"
- android:layout_height="wrap_content" android:text="播放音频">
- <button android:id="@+id/Button02" android:layout_width="wrap_content"
- android:layout_height="wrap_content" android:text="停止播放">
- <seekbar android:id="@+id/SeekBar02" android:layout_height="wrap_content"
- android:layout_width="fill_parent">
- <surfaceview android:id="@+id/SurfaceView01"
- android:layout_width="fill_parent" android:layout_height="250px">
- <linearlayout android:id="@+id/LinearLayout02"
- android:layout_width="wrap_content" android:layout_height="wrap_content">
- <button android:layout_width="wrap_content"
- android:layout_height="wrap_content" android:id="@+id/Button03"
- android:text="播放视频">
- <button android:layout_width="wrap_content"
- android:layout_height="wrap_content" android:text="停止播放" android:id="@+id/Button04">
本文程序的源码,有点长:
- package com.testMedia;
- import java.io.IOException;
- import java.util.Timer;
- import java.util.TimerTask;
- import android.app.Activity;
- import android.media.AudioManager;
- import android.media.MediaPlayer;
- import android.os.Bundle;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- import android.view.View;
- import android.widget.Button;
- import android.widget.SeekBar;
- import android.widget.Toast;
- public class testMedia extends Activity {
- /** Called when the activity is first created. */
- private SeekBar skb_audio=null;
- private Button btn_start_audio = null;
- private Button btn_stop_audio = null;
- private SeekBar skb_video=null;
- private Button btn_start_video = null;
- private Button btn_stop_video = null;
- private SurfaceView surfaceView;
- private SurfaceHolder surfaceHolder;
- private MediaPlayer m = null;
- private Timer mTimer;
- private TimerTask mTimerTask;
- private boolean isChanging=false;//互斥变量,防止定时器与SeekBar拖动时进度冲突
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //----------Media控件设置---------//
- m=new MediaPlayer();
- //播放结束之后弹出提示
- m.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
- @Override
- public void onCompletion(MediaPlayer arg0) {
- Toast.makeText(testMedia.this, "结束", 1000).show();
- m.release();
- }
- });
- //----------定时器记录播放进度---------//
- mTimer = new Timer();
- mTimerTask = new TimerTask() {
- @Override
- public void run() {
- if(isChanging==true)
- return;
- if(m.getVideoHeight()==0)
- skb_audio.setProgress(m.getCurrentPosition());
- else
- skb_video.setProgress(m.getCurrentPosition());
- }
- };
- mTimer.schedule(mTimerTask, 0, 10);
- btn_start_audio = (Button) this.findViewById(R.id.Button01);
- btn_stop_audio = (Button) this.findViewById(R.id.Button02);
- btn_start_audio.setOnClickListener(new ClickEvent());
- btn_stop_audio.setOnClickListener(new ClickEvent());
- skb_audio=(SeekBar)this.findViewById(R.id.SeekBar01);
- skb_audio.setOnSeekBarChangeListener(new SeekBarChangeEvent());
- btn_start_video = (Button) this.findViewById(R.id.Button03);
- btn_stop_video = (Button) this.findViewById(R.id.Button04);
- btn_start_video.setOnClickListener(new ClickEvent());
- btn_stop_video.setOnClickListener(new ClickEvent());
- skb_video=(SeekBar)this.findViewById(R.id.SeekBar02);
- skb_video.setOnSeekBarChangeListener(new SeekBarChangeEvent());
- surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);
- surfaceHolder = surfaceView.getHolder();
- surfaceHolder.setFixedSize(100, 100);
- surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- }
- /*
- * 按键事件处理
- */
- class ClickEvent implements View.OnClickListener{
- @Override
- public void onClick(View v) {
- if(v==btn_start_audio)
- {
- m.reset();//恢复到未初始化的状态
- m=MediaPlayer.create(testMedia.this, R.raw.big);//读取音频
- skb_audio.setMax(m.getDuration());//设置SeekBar的长度
- try {
- m.prepare(); //准备
- } catch (IllegalStateException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- m.start(); //播放
- }
- else if(v==btn_stop_audio || v==btn_stop_video)
- {
- m.stop();
- }
- else if(v==btn_start_video)
- {
- m.reset();//恢复到未初始化的状态
- m=MediaPlayer.create(testMedia.this, R.raw.test);//读取视频
- skb_video.setMax(m.getDuration());//设置SeekBar的长度
- m.setAudioStreamType(AudioManager.STREAM_MUSIC);
- m.setDisplay(surfaceHolder);//设置屏幕
- try {
- m.prepare();
- } catch (IllegalArgumentException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalStateException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- m.start();
- }
- }
- }
- /*
- * SeekBar进度改变事件
- */
- class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener{
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress,
- boolean fromUser) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- isChanging=true;
- }
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- m.seekTo(seekBar.getProgress());
- isChanging=false;
- }
- }
- }
Android提高21篇之一:MediaPlayer的更多相关文章
- Android提高21篇之二:SurfaceView的基本使用方法
上次介绍MediaPlayer的时候稍微介绍了SurfaceView,SurfaceView由于可以直接从内存或者DMA等硬件接口取得图像数据,因此是个非常重要的绘图容器,这次我就用两篇文章来介绍Su ...
- Android提高第二篇之SurfaceView的基本使用
本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 上次介绍MediaPlayer的时候略微介绍了SurfaceView,SurfaceView因为能够直接从内存 ...
- Android提高第九篇之GridView和SQLite实现分页表格
实现并封装一个SQL分页表格控件,不仅支持分页还是以表格的形式展示数据.先来看看本文程序运行的动画: 这个SQL分页表格控件主要分为“表格区”和“分页栏”这两部分,这两部分都是基于GridView实现 ...
- 【朝花夕拾】Android自定义View篇之(八)多点触控(上)MotionEvent简介
前言 在前面的文章中,介绍了不少触摸相关的知识,但都是基于单点触控的,即一次只用一根手指.但是在实际使用App中,常常是多根手指同时操作,这就需要用到多点触控相关的知识了.多点触控是在Android2 ...
- 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象
前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...
- Android中插件开发篇之----动态加载Activity(免安装运行程序)
一.前言 又到周末了,时间过的很快,今天我们来看一下Android中插件开发篇的最后一篇文章的内容:动态加载Activity(免安装运行程序),在上一篇文章中说道了,如何动态加载资源(应用换肤原理解析 ...
- (转) ICCV 2015:21篇最火爆研究论文
ICCV 2015:21篇最火爆研究论文 ICCV 2015: Twenty one hottest research papers “Geometry vs Recognition” ...
- android之存储篇——SQLite数据库
转载:android之存储篇_SQLite数据库_让你彻底学会SQLite的使用 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么. 例如:可以在In ...
- 跟Google学习Android开发-起始篇-构建你的第一个应用程序(4)
说明:此系列教程翻译自Google Android开发者官网的Training教程,利用Chome浏览器的自动翻译功能作初译,然后在一些语句不顺或容易造成误解的地方作局部修正.方便英文不好的开发者查看 ...
随机推荐
- HDU 5365 Run
题意:给n个整点,问用其中若干个做顶点能够成多少个正三角形或正四边形或正五边形或正六边形. 解法:出题人说 地球人都知道整点是不能构成正五边形和正三边形和正六边形的,所以只需暴力枚举四个点判断是否是正 ...
- Java Sleep() 与 Wait()的机制原理与区别
一.概念.原理.区别 Java中的多线程是一种抢占式的机制而不是分时机制.线程主要有以下几种状态:可运行,运行,阻塞,死亡.抢占式机制指的是有多个线程处于可运行状态,但是只有一个线程在运行. 回 ...
- MVC和WebForm的优缺点对比
1 WebForm优点 1)支持事件模型开发,得益于丰富的服务端组件,WebForm开发可以迅速的搭建Web应用 2)使用方便,入门容易 3)控件丰富的WebForm 2 WebForm缺点 1)封 ...
- htmlcss笔记--标签默认值样式重置css reset
1.<a>标签 有默认文字修饰:下划线, 去除:text-decoration:none; text-decoration属性值: none 默认.定义标准的文本. underline 定 ...
- HDU5765 Bonds 最小割极
http://acm.hdu.edu.cn/showproblem.php?pid=5765 题意:无向连通图,问每条边在几个最小割极上 思路:用位压形式,表示边的关系.g[1<<i]=1 ...
- matlab图像基础知识
1.MATLAB支持的几种图像文件格式: ⑴JPEG(Joint Photogyaphic Expeyts Group):一种称为联合图像专家组的图像压缩格式. ⑵BMP(Windows Bitmap ...
- 微信分享,使用js,分享给朋友,朋友圈,QQ微博
<script> var imgUrl = "http://www.baidu.com/img/bdlogo.gif"; var lineLink = "ht ...
- 给sublime text添加ubuntu launcher快捷方式
1.下载sublime text 2文件,解压并复制到/opt目录,文件夹名称不要含有空格 2.在/usr/share/applications目录下新建sublime_text.desktop文件 ...
- http协议中的Content-Type
今天对http协议中的Content-Type有所理解了 它的主要功给我的感觉,还是在前台(客户端)给服务器传输数据时,描述这个数据的格式. 比如,我只传一个表单数据,但这个表单中只有文本,没有其它的 ...
- 第二百三十八天 how can I 坚持
最近睡觉,老是梦到死亡,多么可怕啊.感觉好虚幻. spring事务管理,框架搭建. 看着没多少事,最起来感觉好多啊. 梳理下最近爬过的山,时间久了会忘,反正上周没爬,下雪了. 10月18号-香山,11 ...