播放视频的话直接调用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;
}

public void setVideoURI(Uri uri) {
setVideoURI(uri, null);
}
public void setVideoURI(Uri uri, Mapheaders) { 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
如需要
已经做了n次作战方案
甚至一天半的