Android播放视频之VideoView(2)

电脑杂谈  发布时间:2019-09-22 12:02:57  来源:网络整理

播放视频的话直接调用VideoView 的start()函数即可,seekTo()函数修改从什么位置开始播放。

pasue()暂停播放,getCurrentPosition()获取播放到什么位置了 时间毫秒。

看一下控制播放进度消息的代码:

@Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.cover:
                Log.d(TAG,"click cover ");
                int currentPosition = videoView.getCurrentPosition();
                int duration = videoView.getDuration();
                Log.d(TAG,"currentPosition = "+currentPosition+"duration = "+duration);
                if(currentPosition>0){//说明已经播放了,不管现在是暂停还是播放中
                    if(playOrPause.getVisibility() == View.VISIBLE){
                        playOrPause.setVisibility(View.GONE);
                    }else {
                        playOrPause.setVisibility(View.VISIBLE);
                    }
                    if(progressLayout.getVisibility() == View.VISIBLE){
                        myHandler.removeCallbacks(runnable);
                        progressLayout.setVisibility(View.GONE);
                    }else {
                        progressLayout.setVisibility(View.VISIBLE);
                        currentTime.setText((currentPosition/1000)/60%60/10+""+(currentPosition/1000)/60%60+":"
                                +(currentPosition/1000)%60/10+""+(currentPosition/1000)%60);
                        sumTime.setText((duration/1000)/60%60/10+""+(duration/1000)/60%60+":"
                                +(duration/1000)%60/10+""+(duration/1000)%60);
                        progressBar.setMax(duration);
                        progressBar.setProgress(currentPosition);
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                while(progressLayout.getVisibility()==View.VISIBLE){
                                    myHandler.sendEmptyMessage(0);
                                    try {
                                        Thread.sleep(1000);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }).start();
                        myHandler.postDelayed(runnable,3000);
                    }
                }
                break;
            default:
                break;
        }
    }
    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            playOrPause.setVisibility(View.GONE);
            progressLayout.setVisibility(View.GONE);
        }
    };

下载该demo源码点击此处

接着看一下VideoView结合MediaController来播放视频,就简单几句代码就可以了:

  videoView = (MyVideoView) findViewById(R.id.video_view);
        videoView.setVideoURI(Uri.parse(PATH));
        MediaController mediaController = new MediaController(this);
        videoView.setMediaController(mediaController);
布局文件

<framelayout android:id="@+id/activity_main" android:layout_height="match_parent" android:layout_width="match_parent" tools:context="cj.com.videoviewdemo3.MainActivity" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
    </framelayout>
效果图如下:

\

可以直接控制视频的播放了。

这里来简单看一下VideoView的源码。

源码位置:frameworks/base/core/java/android/widget/VideoView.java

public VideoView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        initVideoView();
    }
private void initVideoView() {
        mVideoWidth = 0;
        mVideoHeight = 0;
        getHolder().addCallback(mSHCallback);
        getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        setFocusable(true);
        setFocusableInTouchMode(true);
        requestFocus();
        mCurrentState = STATE_IDLE;
        mTargetState  = STATE_IDLE;
    }

videoview播放黑屏_android videoview_android videoview

  public void setVideoURI(Uri uri) {
        setVideoURI(uri, null);
    }
 public void setVideoURI(Uri uri, Map headers) {
        mUri = uri;
        mHeaders = headers;
        mSeekWhenPrepared = 0;
        openVideo();
        requestLayout();
        invalidate();
    },>
private void openVideo() {
        if (mUri == null || mSurfaceHolder == null) {
            // not ready for playback just yet, will try again later
            return;
        }
        // Tell the music playback service to pause
        // TODO: these constants need to be published somewhere in the framework.
        Intent i = new Intent("com.android.music.musicservicecommand");
        i.putExtra("command", "pause");
        mContext.sendBroadcast(i);
        // we shouldn't clear the target state, because somebody might have
        // called start() previously
        release(false);
        try {
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setOnPreparedListener(mPreparedListener);
            mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
            mMediaPlayer.setOnCompletionListener(mCompletionListener);
            mMediaPlayer.setOnErrorListener(mErrorListener);
            mMediaPlayer.setOnInfoListener(mOnInfoListener);
            mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
            mCurrentBufferPercentage = 0;
            mMediaPlayer.setDataSource(mContext, mUri, mHeaders);
            mMediaPlayer.setDisplay(mSurfaceHolder);
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mMediaPlayer.setScreenOnWhilePlaying(true);
            mMediaPlayer.prepareAsync();
            // we don't set the target state here either, but preserve the
            // target state that was there before.
            mCurrentState = STATE_PREPARING;
            attachMediaController();
        } catch (IOException ex) {
            Log.w(TAG, "Unable to open content: " + mUri, ex);
            mCurrentState = STATE_ERROR;
            mTargetState = STATE_ERROR;
            mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
            return;
        } catch (IllegalArgumentException ex) {
            Log.w(TAG, "Unable to open content: " + mUri, ex);
            mCurrentState = STATE_ERROR;
            mTargetState = STATE_ERROR;
            mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
            return;
        }
    }


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-123742-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...