Android Studio 导入 Vitamio及横竖屏切换

建议不要使用Vitamio,各种深坑

https://github.com/Bilibili/ijkplayer看看bilibili的开源播放器

Vitamio

官方:https://www.vitamio.org/
GitHub:https://github.com/yixia/VitamioBundle

Vitamio 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,支持 MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播。

1.下载Vitamio


2.解压并导入Android

  • 找到到文件夹VitamioBundle

  • File > New > New Module
  • 导入完成后是这样的

3.导入到自己的项目(即不使用Vitamio的libiary,强迫症专属)

A.在自己的目录下建立io.vov.vitamio

并导入所有的类,以及将jniLibs目录拷贝到main目录下,还有相关的资源文件

B.在AndroidManifest.xml文件中写入

<activity
android:name="io.vov.vitamio.activity.InitActivity"             android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:launchMode="singleTop"
android:theme="@android:style/Theme.NoTitleBar"
android:windowSoftInputMode="stateAlwaysHidden"/>

并加入相应的权限

C.在你喜欢的地方初始化Vitamio

开玩笑的,放在activity或者是Application的onCreate中

Vitamio.isInitialized(application.getApplicationContext());


3.Vatimio的使用

A.界面的搭建

可以看到
整个页面主要分上下两层,主要是为了视屏全屏的时候能方便的隐藏整个下面的布局

B.使用

在此之前为了方便的使用视屏全屏播放,对MediaController(package io.vov.vitamio.widget)做一个小小的改造:
添加一个构造:主要用于把视屏,进度条等放到一个View中,便于全屏展示

//这个全屏的操作可把我难坏了,看到这个真的是为原作者的机智点赞
  public MediaController(Context context,boolean fromXml,View container) {
    super(context);
    initController(context);
    mFromXml = fromXml;
    mRoot = makeControllerView();
    //这个地方的FrameLayout.LayoutpParams是因为布局文件中要把MediaController的视图作为childView加到一个FrameLayout中去
    LayoutParams p = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
    //想怎样布局MediaController就尽情的发挥这个LayoutParams吧
    p.gravity = Gravity.BOTTOM;
    mRoot.setLayoutParams(p);
    ((FrameLayout)container).addView(mRoot);
  }

接着你就可以愉快的玩耍了:
在oncreate中调用

  initVitamioView();
//初始化控件
private void initVitamioView() {
//VideoView
mVideoView = (VideoView) findViewById(R.id.buffer);
//这个就是包裹整个视屏模块的FrameLayout
fl_controller = (FrameLayout) findViewById(R.id.fl_controller);
//缓冲时出现的进度条
pb = (ProgressBar) findViewById(R.id.probar);
//播放进度,并可以拖动调节视屏播放位置
downloadRateView = (TextView) findViewById(R.id.download_rate);
loadRateView = (TextView) findViewById(R.id.load_rate);
//设置视屏setVideoURI可以缓冲并播放
//setVideoPath()缓冲完再播放
mVideoView.setVideoURI(Uri.parse(TextUtils.isEmpty(path)?defaultPath:path));
//这里使用自定义的那个MediaController构造
mMediaController= new MediaController(this, true, fl_controller);
//这里的监听其实是在MediaController中自己定义的,主要就是全屏的切换按钮
mMediaController.setOnControllerClick(new MediaController.OnControllerClick() {
     @Override
     public void OnClick(int type) {
         if (type == 0) {  //表示点击切换全屏按钮
              if (isPortrait) {
                  //不是全屏,切换为全屏
                 //代码块1
               } else {
                  //是全屏,近来就切为原来的大小
                 //代码块2
               }
          }
          }
        });

//类似绑定
mVideoView.setMediaController(mMediaController);
//隐藏控制模块
mMediaController.setVisibility(View.GONE);
mVideoView.requestFocus();
//设置对视屏信息的监听
mVideoView.setOnInfoListener(this);
//视屏缓冲的监听
mVideoView.setOnBufferingUpdateListener(this);
//视屏OK
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
     @Override
     public void onPrepared(MediaPlayer mediaPlayer) {
         //设置播放速度
         mediaPlayer.setPlaybackSpeed(1.0f);
            }
        });
    }

补充代码块1

RelativeLayout.LayoutParams fl_lp = new RelativeLayout.LayoutParams(displayheight, displayWidth);
                        fl_controller.setLayoutParams(fl_lp);
//设置横屏                        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  //这样mVideoView会自己充满全屏
                        mVideoView.setVideoLayout(VideoView.VIDEO_LAYOUT_SCALE, 0);
                        isPortrait = false;

代码块2

RelativeLayout.LayoutParams fl_lp = new RelativeLayout.LayoutParams(
                                LinearLayout.LayoutParams.MATCH_PARENT,
                                DensityUtils.dip2px(ClassRoomActivity.this,200)
                        );
                        fl_controller.setLayoutParams(fl_lp);
                        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                        isPortrait = true;
/*
 * 横竖屏切换的时候回走这个回调
 *
 */
@Override
public void onConfigurationChanged(Configuration newConfig) {
        //屏幕切换时,设置全屏
        if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            //隐藏下面的布局和标题
            tLBelow.setVisibility(View.GONE);
            mTitlebar.setVisibility(View.GONE);
        }
        if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
             //显示下面的布局和标题
            tLBelow.setVisibility(View.VISIBLE);
            mTitlebar.setVisibility(View.VISIBLE);
        }

        super.onConfigurationChanged(newConfig);
    }

C.两个重要的监听(上面已经注册过了)

//缓冲的监听
@Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
    //显示缓冲进度
        loadRateView.setText(percent + "%");
    }
//视屏信息监听
@Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        switch (what) {
        //开始缓冲
            case MediaPlayer.MEDIA_INFO_BUFFERING_START:
                if (mVideoView.isPlaying()) {
                    mVideoView.pause();
                    pb.setVisibility(View.VISIBLE);
                    downloadRateView.setText("");
                    loadRateView.setText("");
                    downloadRateView.setVisibility(View.VISIBLE);
                    loadRateView.setVisibility(View.VISIBLE);
                }
                break;
                //停止缓冲,这里自动开始播放
            case MediaPlayer.MEDIA_INFO_BUFFERING_END:
                mVideoView.start();
                pb.setVisibility(View.GONE);
                downloadRateView.setVisibility(View.GONE);
                loadRateView.setVisibility(View.GONE);
                break;
            case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED:
                //缓冲的...那个啥    change
                downloadRateView.setText("" + extra + "kb/s" + "  ");
                break;
        }
        return true;
    }

4.就这样

对了,完事记得

@Override
    protected void onDestroy() {
            mVideoView.stopPlayback();
           super.onDestroy();
    }

基本就是这样了,其他的问题自己解决一下就好了…

时间: 2024-09-21 07:26:05

Android Studio 导入 Vitamio及横竖屏切换的相关文章

android 4.0以上版本横竖屏切换后不重建不销毁Activity

在AndroidManifest.xml文件的activity节点设置属性 android:configChanges="keyboardHidden|orientation"后可以使应用横竖屏切换时,不会重启对应的 Activity重新加载.可以在对应的Activity java类中重写onConfigurationChanged(Configuration newConfig)方法来处理纵横屏各自的布局,但要记得最后调用super.onConfigurationChanged(ne

关于Android横竖屏切换及Activity重启周期的总结

禁止Android横竖屏和解决切换屏幕时重启Activity的方法 1.在AndroidManifest.xml的Activity配置中加入 android:screenOrientation="landscape"属性(landscape是横向,portrait是纵向).如: <activity android:name=".ContactsManagerActivity" android:label="@string/app_name"

Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法_Android

本文实例讲述了Android编程实现横竖屏切换时不销毁当前activity和锁定屏幕的方法.分享给大家供大家参考,具体如下: 首先在Mainifest.xml的Activity元素中加入android:configChanges="orientation|keyboardHidden"属性 <activityandroid:name=".FileBrowser"android:label="@string/app_name"android:

横竖屏切换-android app启动时根据是手机端还是Pad端进行横竖屏判断,以及不同布局

问题描述 android app启动时根据是手机端还是Pad端进行横竖屏判断,以及不同布局 如何判断一个app,如果运行在平板上,就横屏展示,如果运行在手机上就竖屏展示.而且在这两个端不允许横竖屏切换.而且MainActivity得长的不一样.意思就是要有两套布局.需要建什么资源文件夹 解决方案 http://jingyan.baidu.com/article/455a9950aa8aaea16627788a.html

Android布局之横竖屏切换

在默认情况下当屏幕从竖评变到横屏时会触发 onConfigurationChanged 事 件 在默认情况下会重新加载画面并显示和横屏一样的画面,这样会有2个问题, * 布局问题,在竖屏 显示的布局 到横屏中由于宽和高发生了变化所有多少 都会影响到布局(除非你定制2套画面在然后加个判断在横屏时怎么显示,在竖 屏时怎么显示),当然最简单的办法就是在 项目的AndroidManifest.xml中找到 你所指定的activity 中加上 o 只竖屏显示的话(android:screenOrienta

解决Android横竖屏切换数据丢失问题的方法_Android

Android横竖屏切换时,当前的Activity会被销毁,然后Activity上面的数据将会全部丢失. 如Listview上面每个item的checkbox,横竖屏切换时,复选框就丢失所有选中信息. 解决方案1:在Androidmanifest.xml的activity标签中加入android:configChanges="orientation|keyboardHidden" <activity android:configChanges="orientation|

Android 的apk重新打包签名后,安装成功后,手机中转屏(横竖屏切换)软件强行自动关闭了

问题描述 Android 的apk重新打包签名后,安装成功后,手机中转屏(横竖屏切换)软件强行自动关闭了 Android 的apk重新打包.签名后,安装成功后,手机中转屏(横竖屏切换)软件强行自动关闭了什么情况,我用apktool打包签名的. 解决方案 最好是接上调试,看看出错时的 logcat 的输出.如果是所有手机都出错,还比较好解决的,就怕重现不了. 解决方案二: 这种情况应该是不支持或不兼容. 解决方案三: activity在转屏的时候会执行onResume(),你可能是有一些变量在转屏

横竖屏 切换-Android横竖屏切换有什么差别呢?

问题描述 Android横竖屏切换有什么差别呢? 个人感觉Android的横竖屏切换是因为重力的感应,之后软件的布局会改变, 但是横竖屏切换的具体差别是什么? 解决方案 页面:页面会重新加载,只要你的布局不是绝对.写死的,通常会自动适应,一般不会出现大问题. 数据:安卓内置的bundle会帮你保存一些系统认为比较重要的数据,还有一些数据是可能会丢失,需要你自己手动保存(具体查看onSaveInstance()等方法) 解决方案二: 页面会重新加载的,因为如果你不在Mainfest.xml文件中配

android开发-Android 里把Activity伪装成Dialog后此Activity不能横竖屏切换?

问题描述 Android 里把Activity伪装成Dialog后此Activity不能横竖屏切换? Android 里把Activity伪装成Dialog后此Activity就不能横竖屏切换了?也不能回调onConfigurationChanged. 还有什么办法能使伪装的dialog 监听到手机横竖屏的变化么 解决方案 就用Activity,不可以吗~实现什么效果~ 解决方案二: 就用Activity,不可以吗~实现什么效果~ 解决方案三: 伪装成....还是Acticvitiy. 解决方案