Android视频播放: VideoView播放视频(三)

VideoView的API:
http://developer.android.com/intl/zh-cn/reference/android/widget/VideoView.html

在来看看它的继承关系 :

java.lang.Object
   ↳    android.view.View
       ↳    android.view.SurfaceView
           ↳    android.widget.VideoView

Added in API level 1

继承自SurfaceView;
上一篇: 想用SurfaceView+MediaPlayer播放视频, 调用起来太麻烦, VideoView就对其做了封装, 很明显, 它解决了这个问题,

先上一张效果图 :
Android视频播放: VideoView播放视频(三)_第1张图片


如果你只需要一个简单的播放视频版本:
xml布局文件:


<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="shibin.com.videoviewdemo.MainActivity">

    <VideoView
        android:id="@+id/videoview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
LinearLayout>

Java代码:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mVideoView = (VideoView) findViewById(R.id.videoview);
        mVideoView.setVideoURI(Uri.parse("视频路径"));
        mVideoView.start();
    }

哈哈, 三行代码完事儿了:

这里给一个视频的测试路径 :

http://ht-mobile.cdn.turner.com/nba/big/teams/kings/2014/12/12/HollinsGlassmov-3462827_8382664.mp4

如果你想实现更多的功能, 来看看它的其他API :

        //监听是否准备好
        mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                //这里可以做一些播放前的操作, 例如取消加载动画之类的
            }
        });
        //播放完的监听
        mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                //播放完的操作, 例如可以重播
                mp.start();
                //或者显示一些其他的视频播放列表
            }
        });
        //错误信息的监听
        mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                //默认return false, 会弹出一个视频错误的对话框, 可以return true;
                return false;
            }
        });
        //一些乱七八糟信息的监听
        mVideoView.setOnInfoListener(new MediaPlayer.OnInfoListener() {
            @Override
            public boolean onInfo(MediaPlayer mp, int what, int extra) {
                // * 
  • {@link #MEDIA_INFO_UNKNOWN} -- 找不到视频 // *
  • {@link #MEDIA_INFO_VIDEO_TRACK_LAGGING} // *
  • {@link #MEDIA_INFO_VIDEO_RENDERING_START} // *
  • {@link #MEDIA_INFO_BUFFERING_START} -- 缓冲开始 // *
  • {@link #MEDIA_INFO_BUFFERING_END} -- 缓冲结束 // *
  • MEDIA_INFO_NETWORK_BANDWIDTH (703) - // * bandwidth information is available (as extra kbps) // *
  • {@link #MEDIA_INFO_BAD_INTERLEAVING} // *
  • {@link #MEDIA_INFO_NOT_SEEKABLE} // *
  • {@link #MEDIA_INFO_METADATA_UPDATE} // *
  • {@link #MEDIA_INFO_UNSUPPORTED_SUBTITLE} // *
  • {@link #MEDIA_INFO_SUBTITLE_TIMED_OUT} /** * 通过what去判断, 可以做相应的操作 */ return false; } }); //设置视频播放路径, 两种方法效果都是一样的,setVideoPath( )背后还是走setVideoURI( ) mVideoView.setVideoPath("xxx"); mVideoView.setVideoURI(Uri.parse("xxx")); //开始播放 mVideoView.start(); //暂停 mVideoView.pause(); //停止 mVideoView.stopPlayback(); //获取视频的总时长 mVideoView.getDuration(); //当前播放视频的位置 mVideoView.getCurrentPosition(); //视频缓存的百分比 mVideoView.getBufferPercentage(); //获取播放状态 mVideoView.isPlaying();
  • 他基本上重写了MediaPlayer的大部分API, 调用方法也类似, 如果你会用MediaPlayer, 那么VideoView使用起来也会得心应手

    PS: 有些API 的调用需要等到视频播放之后才会有效, 例如: 例如获取视频播放时长, 获取缓冲百分比,,,,
    还有, 记得加上网络访问权限

    总结: 它的优点很明显, 调用非常方便,

    当然缺点也有的: 比如播放加载时候过长; 在比如: 如果你想要把它放在一个可以滑动的列表中, 见鬼去吧! 滑动的时候可能导致屏幕渲染变黑的问题~~

    当然, 这个问题会在后面的文章中被解决.

    你可能感兴趣的:(Android视频播放)