VideoView 是android 系统提供的一个媒体播放显示和控制的控件。其结构层次如下:
extends SurfaceView
implements MediaController.MediaPlayerControl
java.lang.Object | |||
↳ | android.view.View | ||
↳ | android.view.SurfaceView | ||
↳ | android.widget.VideoView |
其中SurfaceView 为显示提供支持,MediaPlayerControl则为媒体控制提供了支持。
在eclair 中播放视频文件时,MediaPlayerControl 的进度条滑块,有时会显示不完整。可以通过修改其
布局描文件frameworks/base/core/res/res/layout/media_controller.xml,来达到理想的效果。
这里基于VideoView 实现了一个MovieView,它支持上一首、下一首的视频播放功能。下面是其主要代码:
public class MovieView extends Activity implements MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener
{
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.movie_view);
mVideoView = (VideoView) findViewById(R.id.surface_view);
Uri uri = getIntent().getData();
mCurrent = getIntent().getIntExtra("start", 0);
MakeCursor();
mVideoView.setOnErrorListener(this);
mVideoView.setOnCompletionListener(this);
mVideoView.setOnPreparedListener(this);
mVideoView.setVideoURI(uri);
mMediaController = new MediaController(this, false);
mMediaController.setPrevNextListeners(mNextListener, mPrevListener);
mVideoView.setMediaController(mMediaController);
mVideoView.start();
}
private void MakeCursor() {
String[] cols = new String[] {
MediaStore.Video.Media._ID,
MediaStore.Video.Media.TITLE,
MediaStore.Video.Media.DATA,
MediaStore.Video.Media.MIME_TYPE,
MediaStore.Video.Media.ARTIST
};
ContentResolver resolver = getContentResolver();
if (resolver == null) {
System.out.println("resolver = null");
} else {
String mSortOrder = MediaStore.Video.Media.TITLE + " COLLATE UNICODE";
String mWhereClause = MediaStore.Video.Media.TITLE + " != ''";
mCursor = resolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
cols, mWhereClause , null, mSortOrder);
}
}
private View.OnClickListener mNextListener = new View.OnClickListener() {
public void onClick(View v) {
mCurrent = (mCurrent + 1) % mCursor.getCount();
mCursor.moveToPosition(mCurrent);
long id = mCursor.getLong(0);
Uri uri= ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id);
mVideoView.setVideoURI(uri);
mVideoView.start();
}
}
private View.OnClickListener mPrevListener = new View.OnClickListener() {
public void onClick(View v) {
/*get prev uri*/
mVideoView.setVideoURI(uri);
mVideoView.start();
}
}
@Override
public void onPause() {
super.onPause();
}
public boolean onError(MediaPlayer player, int arg1, int arg2) {
}
public void onCompletion(MediaPlayer mp) {
}
public void onPrepared(MediaPlayer mp) {
}
}