【问题标题】:Videoview Pausing and resumingVideoview暂停和恢复
【发布时间】:2011-09-02 21:43:37
【问题描述】:

我是 android 开发的新手,我正在编写游戏。我的游戏有在每个关卡开始之前播放的过场动画,通过 videoview 完成的过场动画。我的问题是,在应用程序暂停时,过场动画在恢复时再次从头开始。

    @Override
public void onPause() {
    super.onPause();
    video.pause();
}
@Override
public void onResume()
{
    super.onResume();
    video.resume();
}

我们的问题是视频实际上并没有从我们暂停的地方恢复,而是从头开始。

【问题讨论】:

    标签: android lifecycle android-videoview


    【解决方案1】:

    你可以用这个

    @Override
    public void onPause() {
        Log.d(TAG, "onPause called");
        super.onPause();
        stopPosition = videoView.getCurrentPosition(); //stopPosition is an int
        videoView.pause();
    }
    @Override
    public void onResume() {
        super.onResume();
        Log.d(TAG, "onResume called");
        videoView.seekTo(stopPosition);
        videoView.start(); //Or use resume() if it doesn't work. I'm not sure
    }
    

    original post

    【讨论】:

    • 对我不起作用。无论如何,它只是从头开始...... Android 4.4.4
    • 顺便说一句,上述解决方案以最简单的流程工作。 @JohnyTex examples.javacodegeeks.com/android/android-videoview-example 很好的代码示例,可能对您有所帮助。
    • 这不适用于我在 5.0 的三星 Galaxy S5 上。但是,@Khang .NT 下面的解决方案效果很好。
    • @DeanPanayotov 亲爱的,答案是在“2013 年 10 月 8 日 6:49 回答”。自那时以来,android api 有很多更新。
    • @SanketPatel 只是澄清当前选择的正确答案可能不适合任何现代版本的 Android。我真的不在乎这个问题什么时候得到答案。它在谷歌首页的顶部被编入索引,所以我只是想让它更相关一些。请让我知道是否有关于旧问题/答案的任何指导方针。谢谢!
    【解决方案2】:

    不应该使用video.pause()、video.resume(),因为调用时会丢失缓冲数据。这也是为什么每当您调用 video.resume() 时 VideoView 在开始播放的原因。 看见: VideoView onResume loses buffered portion of the video

    解决方案:

    VideoView videoView;
    MediaPlayer mp;
    
    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    this.mp = mp;
                }
            });
    
    public void pause(){
        //NOT videoview.pause(); Needn't save Stop position
        if (mp != null){
           mp.pause();
        }
    }
    
    public void resume(){
        //NOT videoview.resume();
        if (mp != null){
           mp.start(); //Video will begin where it stopped
        }   
    }
    

    【讨论】:

    • 你能解释一下我们应该在哪里使用这些pause()和resume()方法吗?
    • 不知道,我看过VideoView类,很简单,就是用SurfaceView实现媒体播放器,不知道为什么每次Pause()时VideoView都会清除缓冲数据。
    • 在带有 5.0 的 Galaxy S5 上运行良好。
    • 当mp.start() 被调用时我得到了IllegalStateException
    • 虽然代码不起作用,但由于信息和提供的链接,我发现这个答案很有用。
    【解决方案3】:

    再次使用start(),而不是resume()。
    它将从您暂停视频的位置开始播放。

    【讨论】:

    • 不,不是。它从视频的开头开始。
    • 这在 5.1.1 中对我不起作用,但它确实可以回到开头。
    • 搞砸了,但是在 pause() 之后 start() 有效,并且 resume() 在 Nexus Player (5.1.1) 上无效。
    • 它对我有用,但对于其他人来说它不起作用,很奇怪,他们甚至没有为 GoogleDevelopers developer.android.com/reference/android/widget/… 中的方法提供任何文档,因此,他们将其留待尝试运气好:(
    【解决方案4】:

    在 OnPause 中可以获取当前位置。

    length=mVideoView.getCurrentPosition();
    

    和OnResume()中使用的长度值。

    mVideoView.seekTo(length);
    mVideoView.start()
    

    工作正常。

    【讨论】:

    • 当我采用这种方法时,这对我来说似乎并不精确。当我暂停后开始播放时,它似乎在视频中跳回了一点。
    【解决方案5】:
        int stopPosition;   // Globally declare class level...
        @Override
        public void onPause() {
            super.onPause();  
            onPauseVideoView();
        }
    
        @Override
        public void onResume() {
            super.onResume();
            Log.e("WatchVideoAd Fragment", "onPause called");
    
            onResumeVideoView();
        }
    
        private void onPauseVideoView() {
            stopPosition = videoview.getCurrentPosition(); //stopPosition is an int
            videoview.pause();
        }
    
        private void onResumeVideoView() {
            videoview.seekTo(stopPosition);
            videoview.start(); //Or use resume() if it doesn't work. I'm not sure
        }
    

    onHiddenChanged 在 Fragment 的情况下

      @Override
        public void onHiddenChanged(boolean hidden) {
            super.onHiddenChanged(hidden);
            if (!hidden) {
                if (getActivity() != null) {
                    ((AppActivity) getActivity()).updateTitle(getResources().getString(R.string.title_game));
                }
                Log.e("keshav", "WatchVideoAd Fragment  ");
                onResumeVideoView();
    
            } else {
    
                Log.e("keshav", "WatchVideoAd Fragment else ");
                onPauseVideoView();
            }
        }
    

    【讨论】:

      【解决方案6】:

      请尝试下面的代码,它绝对可以正常工作

       @Override
      public void onPause() {
          super.onPause();
          stopPosition = videoView.getCurrentPosition(); //stopPosition is an int
          if (videoView.isPlaying())
              videoView.pause();
      }
      
      @Override
      public void onResume() {
          super.onResume();
          if (videoView != null) {
              videoView.seekTo(stopPosition);
          }
      }
      

      请确保在您的 Manifest.xml 中提及以下行

      <activity
              android:name="<Video Play Activity Name Here>"
              android:configChanges="orientation|keyboardHidden|screenSize" 
              android:screenOrientation="landscape"
              ></activity>
      

      【讨论】:

      • 您没有在 onResume() 中再次调用 start()。而且我很确定通过使用 seek() 视频会在实际停止位置之前寻找下一个 I 帧,从而跳过视频的几秒钟(取决于您的 I 帧速率)。
      【解决方案7】:

      只需使用 onSaveInstanseState 方法代替 onPause 并使用 onRestart 代替 onResume。它肯定会奏效。干杯!

      【讨论】:

        猜你喜欢
        • 2013-07-19
        • 2015-07-28
        • 2014-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多