http://pan.baidu.com/s/1lgKLS

package cn.bgxt.surfaceviewdemo;   import java.io.File;   import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnErrorListener; import android.media.MediaPlayer.OnPreparedListener; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.Toast;   public class MainActivity extends Activity { private final String TAG = "main"; private EditText et_path; private SurfaceView sv; private Button btn_play, btn_pause, btn_replay, btn_stop; private MediaPlayer mediaPlayer; private SeekBar seekBar; private int currentPosition = 0; private boolean isPlaying;   @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);   seekBar = (SeekBar) findViewById(R.id.seekBar); sv = (SurfaceView) findViewById(R.id.sv); et_path = (EditText) findViewById(R.id.et_path);   btn_play = (Button) findViewById(R.id.btn_play); btn_pause = (Button) findViewById(R.id.btn_pause); btn_replay = (Button) findViewById(R.id.btn_replay); btn_stop = (Button) findViewById(R.id.btn_stop);   btn_play.setOnClickListener(click); btn_pause.setOnClickListener(click); btn_replay.setOnClickListener(click); btn_stop.setOnClickListener(click);   // 为SurfaceHolder添加回调 sv.getHolder().addCallback(callback); // 4.0版本之下需要设置的属性 // 设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到界面 // sv.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 为进度条添加进度更改事件 seekBar.setOnSeekBarChangeListener(change); }   private Callback callback = new Callback() { // SurfaceHolder被修改的时候回调 @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.i(TAG, "SurfaceHolder 被销毁"); // 销毁SurfaceHolder的时候记录当前的播放位置并停止播放 if (mediaPlayer != null && mediaPlayer.isPlaying()) { currentPosition = mediaPlayer.getCurrentPosition(); mediaPlayer.stop(); } }   @Override public void surfaceCreated(SurfaceHolder holder) { Log.i(TAG, "SurfaceHolder 被创建"); if (currentPosition > 0) { // 创建SurfaceHolder的时候,如果存在上次播放的位置,则按照上次播放位置进行播放 play(currentPosition); currentPosition = 0; } }   @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.i(TAG, "SurfaceHolder 大小被改变"); }   };   private OnSeekBarChangeListener change = new OnSeekBarChangeListener() {   @Override public void onStopTrackingTouch(SeekBar seekBar) { // 当进度条停止修改的时候触发 // 取得当前进度条的刻度 int progress = seekBar.getProgress(); if (mediaPlayer != null && mediaPlayer.isPlaying()) { // 设置当前播放的位置 mediaPlayer.seekTo(progress); } }   @Override public void onStartTrackingTouch(SeekBar seekBar) {   }   @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {   } };   private View.OnClickListener click = new View.OnClickListener() {   @Override public void onClick(View v) {   switch (v.getId()) { case R.id.btn_play: play(0); break; case R.id.btn_pause: pause(); break; case R.id.btn_replay: replay(); break; case R.id.btn_stop: stop(); break; default: break; } } };     /* * 停止播放 */ protected void stop() { if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; btn_play.setEnabled(true); isPlaying = false; } }   /** * 开始播放 * * @param msec 播放初始位置 */ protected void play(final int msec) { // 获取视频文件地址 String path = et_path.getText().toString().trim(); File file = new File(path); if (!file.exists()) { Toast.makeText(this, "视频文件路径错误", 0).show(); return; } try { mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); // 设置播放的视频源 mediaPlayer.setDataSource(file.getAbsolutePath()); // 设置显示视频的SurfaceHolder mediaPlayer.setDisplay(sv.getHolder());
//AssetFileDescriptor fileDescriptor = getAssets().openFd("welcome_video_scene_dark.mp4");
//mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());


Log.i(TAG,
"开始装载"); mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { Log.i(TAG, "装载完成"); mediaPlayer.start(); // 按照初始位置播放 mediaPlayer.seekTo(msec); // 设置进度条的最大进度为视频流的最大播放时长 seekBar.setMax(mediaPlayer.getDuration()); // 开始线程,更新进度条的刻度 new Thread() { @Override public void run() { try { isPlaying = true; while (isPlaying) { int current = mediaPlayer .getCurrentPosition(); seekBar.setProgress(current); sleep(500); } } catch (Exception e) { e.printStackTrace(); } } }.start(); btn_play.setEnabled(false); } }); mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { // 在播放完毕被回调 btn_play.setEnabled(true); } }); mediaPlayer.setOnErrorListener(new OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { // 发生错误重新播放 play(0); isPlaying = false; return false; } }); } catch (Exception e) { e.printStackTrace(); } } /** * 重新开始播放 */ protected void replay() { if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.seekTo(0); Toast.makeText(this, "重新播放", 0).show(); btn_pause.setText("暂停"); return; } isPlaying = false; play(0); } /** * 暂停或继续 */ protected void pause() { if (btn_pause.getText().toString().trim().equals("继续")) { btn_pause.setText("暂停"); mediaPlayer.start(); Toast.makeText(this, "继续播放", 0).show(); return; } if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); btn_pause.setText("继续"); Toast.makeText(this, "暂停播放", 0).show(); } } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <EditText        android:id="@+id/et_path"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="/sdcard/ykzzldx.mp4" />    <SeekBar        android:id="@+id/seekBar"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:orientation="horizontal" >        <Button            android:id="@+id/btn_play"            android:layout_width="0dip"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="播放" />        <Button            android:id="@+id/btn_pause"            android:layout_width="0dip"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="暂停" />        <Button            android:id="@+id/btn_replay"            android:layout_width="0dip"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="重播" />        <Button            android:id="@+id/btn_stop"            android:layout_width="0dip"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text="停止" />    </LinearLayout>    <SurfaceView        android:id="@+id/sv"        android:layout_width="fill_parent"        android:layout_height="fill_parent" /></LinearLayout>

更多相关文章

  1. Android常用控件之RecyclerView
  2. Android(安卓)仿苹果自定义Dialog
  3. 利用广播实现ip拨号
  4. com.android.cts.devicepolicy.ManagedProfileTest -- testAppLi
  5. 类微信播放音频帧动画实现
  6. Android(安卓)Metrail Design
  7. Android(安卓)技术总结(016)—— 使用百度地图api获取当前位置
  8. android EditText不弹出软键盘的方法
  9. ListView设置Header无分隔线

随机推荐

  1. android,自定义ViewGroup,tagView,横竖摆
  2. android 使用uinput模拟输入设备的方法
  3. Android中AIDL的使用详解
  4. Android的ScrollView简单使用实例(附Demo
  5. Android实现3秒钟自动关闭界面
  6. Android(安卓)按钮快速点击问题的解决方
  7. Android(安卓)studio JNI中快速生成头文
  8. Android(安卓)Studio 设置自动配置git忽
  9. 【android】轻松集成支付包支付
  10. 利用 Android(安卓)Studio 和 Gradle 打