使用AudioView进行视频播放的时候,是不是很不爽,千篇一律的模式,恶心吧。这里,我们可以通过一些方式对MediaPlayer进行包装。而所用到的正是SurfaceView以及SurfaceHolder。

最终效果图:

我们提供了四个按钮,可以进行播放控制。

--------------------------------------------------------------------------------

布局文件media.xml代码:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <SurfaceView android:id="@+id/surfaceView1" android:layout_width="320px" android:layout_height="160px"></SurfaceView> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageButton android:id="@+id/button_play" android:src="@drawable/play" android:onClick="buttonClick" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageButton> <ImageButton android:id="@+id/button_pause" android:src="@drawable/pause" android:onClick="buttonClick" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageButton> <ImageButton android:id="@+id/button_stop" android:src="@drawable/stop" android:onClick="buttonClick" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageButton> <ImageButton android:id="@+id/button_reset" android:src="@drawable/reset" android:onClick="buttonClick" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageButton> </LinearLayout> </LinearLayout>

activity代码:

package cn.com.chenzheng_java.media; import android.app.Activity; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; /** * @description 通过SurfaceView/SurfaceHolder实现自己的播放器 * @author chenzheng_java * @since 2011/03/23 * @description 这里进行一下补充说明,我们可以通过mediaplayer添加OnPreparedListener * 以及OnCompletionListener等事件对准备好播放以及播放完成后的操作进行控制。 * 使用SurfaceView以及SurfaceHolder进行视频播放时,结构是这样的: * 1、首先,我们从布局文件中获取一个surfaceView * 2、通过surfaceView.getHolder()方法获取与该容器想对应的surfaceHolder * 3、对srufaceHolder进行一些默认的设置,如addCallback()和setType() * 4、通过mediaPlayer.setDisplay()方法将视频播放与播放容器链接起来 */ public class MyMediaPlayerActivity extends Activity { MediaPlayer mediaPlayer ; // 播放器的内部实现是通过MediaPlayer SurfaceView surfaceView ;// 装在视频的容器 SurfaceHolder surfaceHolder;// 控制surfaceView的属性(尺寸、格式等)对象 boolean isPause ; // 是否已经暂停了 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.media); surfaceView = (SurfaceView) findViewById(R.id.surfaceView1); /** * 获取与当前surfaceView相关联的那个的surefaceHolder */ surfaceHolder = surfaceView.getHolder(); /** * 注册当surfaceView创建、改变和销毁时应该执行的方法 */ surfaceHolder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.i("通知", "surfaceHolder被销毁了"); if(mediaPlayer!=null) mediaPlayer.release(); } @Override public void surfaceCreated(SurfaceHolder holder) { Log.i("通知", "surfaceHolder被create了"); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.i("通知", "surfaceHolder被改变了"); } }); /** * 这里必须设置为SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS哦,意思 * 是创建一个push的'surface',主要的特点就是不进行缓冲 */ surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } /*** * @param targetButton 被用户点击的按钮 */ public void buttonClick(View targetButton){ int buttonId = targetButton.getId(); switch (buttonId) { case R.id.button_play: play(); break; case R.id.button_pause: pause(); break; case R.id.button_reset: reset(); break; case R.id.button_stop: stop(); break; default: break; } } /** * 播放 */ private void play(){ mediaPlayer = new MediaPlayer(); // 设置多媒体流类型 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); // 设置用于展示mediaPlayer的容器 mediaPlayer.setDisplay(surfaceHolder); try { mediaPlayer.setDataSource("/data/jinsha.3gp"); mediaPlayer.prepare(); mediaPlayer.start(); isPause = false; } catch (Exception e) { Log.i("通知", "播放过程中出现了错误哦"); } } /** * 暂停 */ private void pause(){ Log.i("通知", "点击了暂停按钮"); if(isPause==false){ mediaPlayer.pause(); isPause=true; }else{ mediaPlayer.start(); isPause=false; } } /** * 重置 */ private void reset(){ Log.i("通知", "点击了reset按钮"); // 跳转到视频的最开始 mediaPlayer.seekTo(0); mediaPlayer.start(); } /** * 停止 */ private void stop(){ Log.i("通知", "点击了stop按钮"); mediaPlayer.stop(); mediaPlayer.release(); } }

更多相关文章

  1. Android(安卓)Studio 导出APK
  2. 状态栏提示Notification
  3. android tv盒子播放器控制 监听上下左右键。
  4. android studio 生成apk
  5. Android开发:使用AudioTrack播放PCM音频数据【附源码】
  6. Android悬浮通知无效的问题
  7. 第一章:初入Android大门(Style 样式和Button事件)
  8. Android简易Flash播放器
  9. 2015程序员值得收藏的十大主流android button模式

随机推荐

  1. Android(安卓)解析XML 之pull
  2. 命令生成和运行android项目
  3. Android数据存取之Files
  4. 用android build system 编译自己的init
  5. unityd 公布android apk相关
  6. Android(安卓)文件绝对路径和Content开头
  7. 【Android Developers Training】 25. 保
  8. Android修改图片颜色-转成灰度图
  9. android命令gradle打包apk
  10. android pullToRefreshListView的item点