Android surfaceview实现显示画面但不立即播放功能!

就是使用surfaceview和mediaplayer播放视频。我要达到的效果是加载时显示出视频画面,但视频处于暂停状态!只有点击后才开始播放。求代码!加载后能立即播放的... 就是使用surfaceview和mediaplayer播放视频。我要达到的效果是加载时显示出视频画面,但视频处于暂停状态!只有点击后才开始播放。求代码!加载后能立即播放的功能我已经实现了!求加载后处于暂停状态的代码! 展开
 我来答
读书台啦啦啦
2020-03-30
知道答主
回答量:1
采纳率:0%
帮助的人:661
展开全部
package com.zsch.forestinventory.activity.left_activity;

import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.zsch.androidlib.activity.BaseActivity;
import com.zsch.androidlib.ui.ZoomableImageView;
import com.zsch.androidlib.view.LVCircularRing;
import com.zsch.forestinventory.R;

import java.io.IOException;

/**
* 查看单张照片
*/
public class ShowVideoActivity extends BaseActivity implements View.OnClickListener, MediaController.MediaPlayerControl, MediaPlayer.OnBufferingUpdateListener, SurfaceHolder.Callback {

private ImageButton ibBack;
private Uri uri;

private MediaPlayer mediaPlayer;
private MediaController controller; //视频播放控制器
private int bufferPercentage = 0;

@Override
protected void initVariables() {
uri = getIntent().getData();
if (uri == null)
finish();

}

@Override
protected void initView(Bundle savedInstanceState) {
setContentView(R.layout.activity_show_video);

mediaPlayer = new MediaPlayer();
controller = new MediaController(this);
//媒体控制器将创建一个具有默认设置的控件,并把它们放到一个窗口里漂浮在你的应用程序上。具体来说,这些控件会漂浮在通过setAnchorView()指定的视图上
//设置这个控制器绑定(anchor/锚)到一个视图上。例如可以是一个VideoView对象,或者是你的activity的主视图。
controller.setAnchorView(findViewById(R.id.root_ll));

if (savedInstanceState == null) {
// Bundle类型的数据与Map类型的数据相似,都是以key-value的形式存储数据的。实际上,savedInstanceState也就是保存Activity的状态的
//onsaveInstanceState方法是用来保存Activity的状态的。当一个Activity在生命周期结束前,会调用该方法保存状态
// 用来保存状态信息的Bundle会同时传给两个method,即onRestoreInstanceState() and onCreate().
uri = getIntent().getData();
} else {
uri = savedInstanceState.getParcelable("uri");
}
if (uri == null) {
Toast.makeText(this, "无视频展示", Toast.LENGTH_SHORT).show();
finish();
return;
}
SurfaceView videoSuf = (SurfaceView) findViewById(R.id.controll_surfaceView);
ibBack=(ImageButton) findViewById(R.id.ibBack);
ibBack.setOnClickListener(this);
videoSuf.setZOrderOnTop(false);//true时 会置顶到window的最上层,那么会遮挡其它view ...
videoSuf.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
videoSuf.getHolder().addCallback(this); //只要继承SurfaceView类并实现SurfaceHolder.Callback接口就可以实现一个自定义的SurfaceView了, 然后有surfaceCreated,surfaceChanged,surfaceDestroyed 等三种方法
// videoSuf.getHolder().setKeepScreenOn(true); //屏幕总是打开
//videoSuf.setFixedSize(320, 220);//显示的分辨率,不设置为视频默认

}

@Override
protected void loadData() {

}
@Override
protected void onResume() {
super.onResume();
// try {
// mediaPlayer.setDataSource(uri.getPath()); //播放存储设备的资源文件
// mediaPlayer.setOnBufferingUpdateListener(this); //监听事件,网络流媒体的缓冲监听。这个方法与上个接口中的方法int getBufferPercentage()进行结合使用
// //mediaPlayer.prepare();
// controller.setMediaPlayer(this);
// controller.setEnabled(true); //设置按钮可点击 false 设置为不可点击
// }catch (IOException e){
// e.printStackTrace();
// }

}

@Override
protected void onPause() {
super.onPause();
if (mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
}

@Override
protected void onDestroy() {
super.onDestroy();
if (null != mediaPlayer){
mediaPlayer.release();
mediaPlayer = null;
}
}

@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.ibBack:
onBackPressed();
break;
}
}

@Override
public void onBackPressed() {
// if (mediaPlayer.isPlaying()){
// mediaPlayer.stop();
// }
// if (null != mediaPlayer){
// mediaPlayer.release();
// mediaPlayer = null;
// }

finish(); // finish();//在Activity中执行this.finish()方法之后,执行如下过程: onPause(),onStop(),onDestory(),
}

@Override
public boolean onTouchEvent(MotionEvent event) { //实现这个方法来处理触摸屏幕引发的事件。
controller.show();
return super.onTouchEvent(event);
}

@Override
public void onPointerCaptureChanged(boolean hasCapture) {

}
//MediaPlayerControl
@Override
public void onBufferingUpdate(MediaPlayer mediaPlayer, int i) {
bufferPercentage = i;
}

@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) { //这步很重要 surfaceCreated创建时使用 //必须在surface创建后才能初始化MediaPlayer,否则不会显示图像

try {
mediaPlayer.setDataSource(uri.getPath()); //播放存储设备的资源文件
mediaPlayer.setOnBufferingUpdateListener(this); //监听事件,网络流媒体的缓冲监听。这个方法与上个接口中的方法int getBufferPercentage()进行结合使用
//mediaPlayer.prepare();
controller.setMediaPlayer(this);
controller.setEnabled(true); //设置按钮可点击 false 设置为不可点击
}catch (IOException e){
e.printStackTrace();
}
//设置显示视频显示在SurfaceView上
mediaPlayer.setDisplay(surfaceHolder);
// prepare方法是将资源同步缓存到内存中,一般加载本地较小的资源可以用这个,如果是较大的资源或者网络资源建议使用prepareAsync方法,异步加载.
// 但如果想让资源启动,即start()起来,因为在异步中,如果不设置监听直接start的话,是拿不到这个资源,如果让线程睡眠一段时间,则可以取得资源,
mediaPlayer.prepareAsync(); //准备 为异步加载
controller.show(); //显示控制器
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}
//这里的 start()和pause() 指的是 media的拍摄过程中的 步骤
@Override
public void start() {
if (null != mediaPlayer){
mediaPlayer.start();
}
}

@Override
public void pause() {
if (null != mediaPlayer){
mediaPlayer.pause();
}
}

@Override
public int getDuration() {
return mediaPlayer.getDuration();
}

@Override
public int getCurrentPosition() { //获得 视频播放的位置 为了暂停后 继续播放
return mediaPlayer.getCurrentPosition();
}

@Override
public void seekTo(int i) {
mediaPlayer.seekTo(i);
}

@Override
public boolean isPlaying() {
if (mediaPlayer.isPlaying()){
return true;
}
return false;

}

@Override
public int getBufferPercentage() {
return bufferPercentage;
}

@Override
public boolean canPause() {
return true;
}

@Override
public boolean canSeekBackward() {
return true;
}

@Override
public boolean canSeekForward() {
return true;
}

@Override
public int getAudioSessionId() {
return 0;
}
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式