android 4.0 videoPlayer上层代码分析

本文详细分析了Android 4.0中视频播放的实现,涉及MovieActivity、MoviePlayer和MovieControllerOverlay类。MovieActivity负责初始化和设置ActionBar,MoviePlayer控制视频播放并监听用户操作,而MovieControllerOverlay处理播放界面的显示和隐藏。文章讨论了ActionBar的使用、音频焦点的请求和释放,以及如何处理视频的暂停、播放和错误处理。同时,还探讨了不同类之间的交互机制,特别是通过接口实现的回调通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4.0的代码和2.3的代码增加了actionbar的功能,增加了对overlay的应用。由两个类变成四个主要类。

MovieActivity.java

该类的的作用主要是做初始化操作,以及设置屏幕的属性:

1.     设置ActionBar的属性

这里简单介绍一下4.0的新控件。个人觉得ActionBar已经被包装的非常强大,我们只需要设置一下即可使用,视频的代码中,ActionBar主要配合ShareActionProvider来作为共享视频来使用(蓝牙,短信,email等)

Action Bar主要是用于代替传统的标题栏,对于Android平板设备来说屏幕更大它的标题使用Action Bar来设计可以展示更多丰富的内容,方便操控。

 Action Bar主要功能包含:

  1. 显示选项菜单
  2. 提供标签页的切换方式的导航功能,可以切换多个fragment.
  3. 提供下拉的导航条目
.
  4. 提供交互式活动视图代替选项条目

  5. 使用程序的图标作为返回Home主屏或向上的导航操作。 

         视频里的使用方法:

1. 在设置完布局文件后创建实例ActionBar actionBar = getActionBar();

     2.设置bar的显示方式,有好多种,可以自己尝试actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP

                ActionBar.DISPLAY_HOME_AS_UP);

      至此actionBar就可以显示出来了。

3.设置共享条目:设置条目的布局文件,setShareIntent

这里的intent的相关设置为Intent.ACTION_SEND,以及Intent.EXTRA_STREAM(发动二进制数据)等,具体见代码。

4.最后,如果某应用程序可以发送该文件,那么在其可以接收的类中配置相关的

   ACTION_FILTERSEND)即可共享该视频或者图片

2.     创建moviePlayer,请求和释放焦点

mPlayer = new MoviePlayer(rootView, this, intent.getData(), savedInstanceState, !mFinishOnCompletion)

传递URI等信息

Onstart方法中请求音频焦点,onstop中释放音频焦点

3.设置屏幕属性

         具体见代码,略

 

MoviePlayer.java

这个类的主要功能是控制视频的播放,对用户的一切动作(触屏,暂停,播放等)进行监听。

首先创建MoviePlayer的时候。实现了三个接口:

1.MediaPlayer.OnErrorListener

     方法onError中我们返回false,这样VideoView本身会弹出错误对话框,这里不用我们做太多处理。

2.MediaPlayer.OnCompletionListener

     方法onCompletion。这里还需要深入

     问题所在:这个方法中应该会关闭activity,返回调用界面。但是这里的代码好像不足以做这些事情,后续研究。

3.ControllerOverlay.Listener

            实现了很多方法,基本为:播放器播放暂停,开始拖拽,设置videoView的拖拽时间,actionBar的显示和隐藏等。

 

该类中的还做了一些基本操作:

1.       视频播放的时候,发送广播让音乐停止

2.       对耳机的插入,蓝牙耳机的暂停播放事件的监听。(耳机拔出时暂停播放)

3.       打开上次没有观看结束的视频时,弹出提示对话框。

下面说说打开该对话框的实现:

首先在观看视频的时候,如果中途返回会执行onPause()方法,那么这里会将该视频的Uripositionduration信息放到bookmark中。

所以每次看视频,执行onCreate的时候,判断该Uri是否为空,如果为空,那么就是代表该视频没有被存为bookmark,那么从头开始播放,否则,弹出dialog提示用户是从头播放还是从bookmark中的position中开始播放。

 

注意:1.在视频被暂停了超过3分钟后,重新开始播放时,视频会从头播放

没有对来电事件进行监听,后续验证4.0在来电和挂断电话时的状态。

 

MovieControllerOverlay.java

ControllerOverlay 

  该接口中的方法主要控制除了actionBar之外的View的显示和隐藏。

OnClickListener,

实现onClickListener接口中方法,如果停在暂停播放界面,

    1.播放结束,如果重复播放,那么调用开始播放

    2.暂停或者播放状态,具体问题具体分析

AnimationListener,

   onAnimationEnd方法中隐藏View

TimeBar.Listener

    onScrubbingStart等三个方法,较容易理解,具体见代码,此处略

 

分析:视频代码是怎样将这三个类紧密联系起来的。

         首先MovieActivity.java这个activity调用MoviePlayer.java来实现播放可以理解.

接口ControllerOverlay定了很多方法,接口中又定义了接口Listener,该做法有什么好处?

而且在MoviePlayerMovieControllerOverlay实现ControllerOverlay接口时有些混乱,

MoviePlayer实现了Listener,而MovieControllerOverlay实现了ControllerOverlay

首先要仔细观察接口中的方法

View getView();

  voidshow();

  void showPlaying();

  void showPaused();

  void showEnded();

  void showLoading();

  void showErrorMessage…;

  void hide();

  void setTimes…;

void resetTime();                 

 

  interface Listener {

    void onPlayPause();

    void onSeekStart();

    void onSeekMove(int time);

    void onSeekEnd(int time);

    voidonShown();

    void onHidden();

    void onReplay();



两个方法中都有相似的show方法,但是分析方法发现,show只要是控制除了actionBar(在listener中处理)之外的View的显示,是大方向的显示控制。在进一步想:实现类MovieControllerOverlay也是对大方向的View的控制,所以两者的用意一致。

listenerMovieControllerOverlayMovieplayer一个沟通桥梁。因为MovieControllerOverlayView大方向显示,但是大方向中也有对VideoView信息的获取,所以要利用listener来实现信息的共享,两个类以回调联系。如show中调用onShown来获取VideoView的播放时间和时长,onShown中又调用setprogess,setProgress调用MovieControllerOverlay中的setTime来实现设置播放界面时间点

这是典型的回调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值