Android中使用SurfaceView视频播放器

public class PlayerVideoActivity extends Activity {

	// SurfaceView控件
	private SurfaceView sv_video;

	private SurfaceHolder surfaceHolder;

	// 播放视频对象
	private MediaPlayer mediaPlayer;

	private String path;

	private boolean PasueFlag = false;

	// 记录暂停播放的位置
	private int currentPosition = 0;

	// 播放按钮的控件
	private LinearLayout video_layout;
	
	//声明一个回放的记录位置
	private int backPosition = 0;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_video);
		// 获取SurfaceView控件
		sv_video = (SurfaceView) findViewById(R.id.sv_video);

		// 通过控件来获取SurfaceHolder
		surfaceHolder = sv_video.getHolder();

		// 回调函数
		surfaceHolder.addCallback(new SurfaceHolder.Callback() {

			// surfaceView控件被销毁的方法
			@Override
			public void surfaceDestroyed(SurfaceHolder holder) {
				// 当点击后退按钮 就杀死 surfaceView控件 activity被杀死
				
				//记录视频所播放的位置
				int position = mediaPlayer.getCurrentPosition();
				mediaPlayer.release();
				mediaPlayer = null;
				
				//声明意图对象
				Intent data = new Intent();
				data.putExtra("position",position);
				PlayerVideoActivity.this.setResult(RESULT_OK, data);
				
				//当前kill
				PlayerVideoActivity.this.finish();
			}

			// surfaceView创建的时候执行的方法
			@Override
			public void surfaceCreated(SurfaceHolder holder) {
				// 当第一次使用SurfaceView的时候 播放视频
				play();
			}

			// surfaceView发生变化执行的操作
			@Override
			public void surfaceChanged(SurfaceHolder holder, int format,
					int width, int height) {

			}
		});

		// 在这里怎么获取intent传递的数据
		path = this.getIntent().getStringExtra("path");
		backPosition = this.getIntent().getIntExtra("position", 0);

		// 获取LinearLayout的对象
		video_layout = (LinearLayout) findViewById(R.id.video_layout);

		// 隐藏
		video_layout.setVisibility(View.GONE);
	}

	public void playerVideo(View v) {
		play();// 播放视频
	}

	// 视频播放的操作
	public void play() {

		if (PasueFlag) {
			if (mediaPlayer != null) {
				// 跳转到播放记录的位置
				mediaPlayer.seekTo(currentPosition);
				mediaPlayer.start();
			}
			// 变为false
			PasueFlag = false;
		} else {
			// 判断视频 是否为播放状态
			if (mediaPlayer != null) {
				if (mediaPlayer.isPlaying()) {
					System.out.println("视频处于播放状态");
				}
			} else {
				// 传递的路径 是否为空
				if (path != null) {
					try {

						// 创建视频播放的对象
						mediaPlayer = new MediaPlayer();

						/**
						 * 视频播放完成出发的事件
						 */
						mediaPlayer
								.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

									@Override
									public void onCompletion(MediaPlayer mp) {
										mediaPlayer.release();
										mediaPlayer = null;
										System.out.println(mediaPlayer
												+ "------------onCompletion"
												+ mp);

									}
								});

						/**
						 * 播放出差错的时候触发的事件
						 * 
						 * 回调函数
						 */
						mediaPlayer
								.setOnErrorListener(new MediaPlayer.OnErrorListener() {

									@Override
									public boolean onError(MediaPlayer mp,
											int what, int extra) {
										mediaPlayer.release();
										mediaPlayer = null;
										return false;
									}
								});

						// 设计音频流类型
						mediaPlayer
								.setAudioStreamType(AudioManager.STREAM_MUSIC);

						// 指定播放的文件
						mediaPlayer.setDataSource(path);
						// 指定用于播放视频的SurfaceView的控件
						mediaPlayer.setDisplay(surfaceHolder);
						mediaPlayer.prepare();
						
						//记录上次播放的位置
						mediaPlayer.seekTo(backPosition);
						mediaPlayer.start();

						PasueFlag = false;

					} catch (IOException e) {

						e.printStackTrace();
					}
				}
			}
		}

	}

	public void pasueVideo(View v) {
		if (mediaPlayer != null && mediaPlayer.isPlaying()) {
			mediaPlayer.pause();
			// 记录这个位置
			currentPosition = mediaPlayer.getCurrentPosition();
			// 标识 这视频 会被暂停
			PasueFlag = true;
		}

	}

	public void stopVideo(View v) {
		if (mediaPlayer != null && mediaPlayer.isPlaying()) {
			mediaPlayer.stop();
			mediaPlayer.release();
			mediaPlayer = null;
			// 暂停标识
			PasueFlag = false;
		}

	}

	public void resetVideo(View v) {
		if (mediaPlayer != null && mediaPlayer.isPlaying()) {
			mediaPlayer.seekTo(0);
			mediaPlayer.start();
		}

	}

	// 触摸事件
	public boolean onTouchEvent(MotionEvent event) {
		// 获取布局对象是否是隐藏
		if (View.GONE == video_layout.getVisibility()) {
			video_layout.setVisibility(View.VISIBLE);// 显示
		} else {
			video_layout.setVisibility(View.GONE);// 隐藏
		}
		return super.onTouchEvent(event);
	}
	


	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.player_video, menu);
		return true;
	}

	/*
	 * protected void onDestroy() { super.onDestroy(); // 释放资源 if (mediaPlayer
	 * != null) { mediaPlayer.release(); mediaPlayer = null; } }
	 */

}

public class VideoActivity extends Activity {

	private static final int VIDEOREQUESTPLAYER = 1;
	private int position = 0;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_list);
	}

	public void player(View v) {
		Intent intent = new Intent(VideoActivity.this,
				PlayerVideoActivity.class);
		File sdCardFile = Environment.getExternalStorageDirectory();
		String path = sdCardFile.getPath() + "/Music/oppo.3gp";
		intent.putExtra("path", path);
		intent.putExtra("position", position);
		startActivityForResult(intent, VIDEOREQUESTPLAYER);
	}

	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);

		System.out.println("-------------------onActivityResult");
		// 判断是否是这个请求
		if (VIDEOREQUESTPLAYER == requestCode) {
			// 判断这个请求的响应吗是否成功
			if (RESULT_OK == resultCode) {
				position = data.getIntExtra("position", 0);
				System.out.println("==========================" + position);
			}

		}
	}

}

<SurfaceView
        android:id="@+id/sv_video"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" />

    <LinearLayout
        android:id="@+id/video_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:gravity="center_horizontal"
        android:orientation="horizontal"
        tools:ignore="UselessParent" >

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="playerVideo"
            android:text="@string/btn_play" />

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="pasueVideo"
            android:text="@string/btn_pasue" />

        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="stopVideo"
            android:text="@string/btn_stop" />

        <Button
            android:id="@+id/button4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="resetVideo"
            android:text="@string/btn_reset" />
    </LinearLayout>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值