Android中使用SurfaceView视频播放器
2015-09-03 15:25
375 查看
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; } }
*/
}
[java]
view plaincopy
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);
}
}
}
}
[java]
view plaincopy
<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>
// 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; } }
*/
}
[java]
view plaincopy
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);
}
}
}
}
[java]
view plaincopy
<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>
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories