在纹理视图表面纹理监听器中播放/暂停媒体播放器

时间:2015-08-12 09:39:01

标签: android video android-mediaplayer android-recyclerview textureview

我已经实施了回收者视图,每个项目都会播放视频。我的问题是我需要在屏幕上下滚动时暂停/播放视频。

我已实现当用户滚动视频时继续播放。

当视图滚出屏幕时,我在尝试跟踪媒体播放器时遇到了问题。

我想出了一个解决方案,我希望能得到一些建议,看看解决方案是否有问题。

所以我使用纹理视图在回收站视图中显示媒体播放器,因为在查看使用回收站或自定义控制器时,视频浏览不兼容。

所以在表面纹理被破坏(表示视图离开了屏幕)我暂停了媒体播放器,当表面纹理可用时(表示视图在屏幕上)我检查媒体播放器是否为空(因为它将当屏幕第一次加载时)如果不是我启动媒体播放器。下面是我的视频播放器课程,您可以在其中查看我的实现。

public class CustomVideoPlayer implements TextureView.SurfaceTextureListener, VideoControllerView.MediaPlayerControl, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnVideoSizeChangedListener {

    private Context mContext;
    private MediaPlayer mMediaPlayer;
    private SurfaceTexture mSurface;
    private VideoControllerView mControllerView;
    private TextureView mTextureView;
    private ProgressBar mProgress;
    private FrameLayout mView;

    public CustomVideoPlayer(Context ctx, TextureView view, ProgressBar progressDialog, FrameLayout holderView){

        this.mContext = ctx;
        mTextureView = view;
        mTextureView.setSurfaceTextureListener(this);
        mProgress = progressDialog;
        mControllerView = new VideoControllerView(ctx);
        mView = holderView;
        mTextureView.setOnTouchListener(new ControlTouchListener());
    }


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

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

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

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

    @Override
    public int getCurrentPosition() {
        return mMediaPlayer.getCurrentPosition();
    }

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

    @Override
    public boolean isPlaying() {
        return mMediaPlayer.isPlaying();
    }

    @Override
    public void pause() {
        mMediaPlayer.pause();
    }

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

    @Override
    public void start() {
        mMediaPlayer.start();
    }

    @Override
    public boolean isFullScreen() {
        return false;
    }

    @Override
    public void toggleFullScreen() {

    }

    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {

    }

    @Override
    public void onCompletion(MediaPlayer mp) {

    }



    @Override
    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {

    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        mSurface = surface;
        if(mMediaPlayer!=null) {
            mMediaPlayer.setSurface(new Surface(mSurface));
            mMediaPlayer.start();
        }
        Log.i(VersysVideoPlayer.class.getSimpleName(), String.valueOf(surface)+"available");
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {

    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        //mSurface = surface;
        if(mMediaPlayer==null){
            Log.i(VersysVideoPlayer.class.getSimpleName(), "MEDIA PLAYER IS NULL");
        }else{
            Log.i(CustomVideoPlayer.class.getSimpleName(), "MEDIA PLAYER IS NOT NULL");
            mMediaPlayer.pause();
        }
        Log.i(CustomVideoPlayer.class.getSimpleName(), String.valueOf(surface)+"destroyed");
        return false;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {

    }

    public void changePlayState(){
        if(mMediaPlayer!=null) {
            if (mMediaPlayer.isPlaying()) {
                mMediaPlayer.pause();
            } else {
                mMediaPlayer.start();
            }
        }else{
            Log.i(CustomVideoPlayer.class.getSimpleName(), "MEDIA PLAYER IS NULL");
        }
    }

    public void startVideo(String url){
        if(mMediaPlayer!=null){
            mMediaPlayer.reset();
            mMediaPlayer.release();
            //mMediaPlayer = new MediaPlayer();
        }else{
            mMediaPlayer = new MediaPlayer();
        }
        if(!mMediaPlayer.isPlaying()){
            try {
                mMediaPlayer.setSurface(new Surface(mSurface));
                mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mMediaPlayer.setDataSource(url);
                mMediaPlayer.prepareAsync();
                mMediaPlayer.setOnCompletionListener(this);
                mMediaPlayer.setOnBufferingUpdateListener(this);
                mMediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
                mMediaPlayer.setOnPreparedListener(this);

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    @Override
    public void onPrepared(MediaPlayer mp) {
        Log.i(CustomVideoPlayer.class.getSimpleName(), "ON PREPARED CALLED");
        mControllerView.setMediaPlayer(this);
        mControllerView.setAnchorView(mView);
        mControllerView.show();
        mProgress.setVisibility(View.GONE);
        mMediaPlayer.start();
       // mMediaPlayer.setVolume(0,0);
    }

    //Touch listener to display video controls
    class ControlTouchListener implements View.OnTouchListener{

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_DOWN){
                mControllerView.show();
            }
            return false;
        }
    }
}

欢迎任何评论或意见。

0 个答案:

没有答案