【问题标题】:blank screen when return to video from background从后台返回视频时黑屏
【发布时间】:2016-01-17 14:37:12
【问题描述】:

我正在使用 google IMA 示例在我的应用程序中运行视频,经过一些更改以确保它满足我的需要,我仍然有一个我无法解决的问题,我希望在应用程序运行时播放视频根据活动停止前的状态从后台返回或暂停。

当用户在暂停模式下停止活动时,我有状态,我有位置,还有一个问题。当我从后台返回视频时,屏幕是黑色的,直到我在控制器中按下开始,并且不需要寻找定位它。

我需要在从后台返回时暂停显示预览图像。

@Override
public void onResume() {
    if (mVideoPlayerController != null) {
        mVideoPlayerController.resume();

        if (mVideoPlayerController.isContentStarted())
            if (isPlayedBeforePaused) {
                mVideoPlayer.play();
            } else {

            }
    }
    super.onResume();
}

在我的视频播放器中:

 @Override
    public void play() {
        start();
    }

    @Override
    public void start() {
        super.start();
        // Fire callbacks before switching playback state.
        switch (mPlaybackState) {
            case STOPPED:
                for (PlayerCallback callback : mVideoPlayerCallbacks) {
                    callback.onPlay();
                }
                break;
            case PAUSED:
                for (PlayerCallback callback : mVideoPlayerCallbacks) {
                    callback.onResume();
                }
                break;
            default:
                // Already playing; do nothing.
        }
        mPlaybackState = PlaybackState.PLAYING;
    }

这是我的糟糕解决方案,但我不想写那种代码

@Override
public void onResume() {
    if (mVideoPlayerController != null) {
        mVideoPlayerController.resume();


        if (mVideoPlayerController.isContentStarted())
            if (isPlayedBeforePaused) {
                mVideoPlayer.play();
            } else {
                mVideoPlayer.play();
                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mVideoPlayer.pause();
                    }
                }, 1000);
            }

    }
    super.onResume();
}

【问题讨论】:

  • 使用 exoplayer 有同样的问题 :)
  • 应用恢复后您是否拨打MediaPlayer#setDisplay()
  • 我不能在简历上设置显示,它会抛出非法状态异常。并且媒体播放器之前已经设置了显示
  • @Amir,你有没有找到任何与 Exoplayer 相同的解决方案

标签: android android-mediaplayer surfaceview android-lifecycle


【解决方案1】:

onPause 中处理暂停播放,同时保存playbackPosition。 在onResume 中检查以前的playbackPosition 和当前。如果它们不匹配,请重新初始化您的 MediaPlayer 搜索到 playbackPosition 并使用 play() 恢复播放,否则只需执行 play()

视图可能还需要重新初始化。这可能是黑屏的原因。

【讨论】:

  • 我已经这样做了,但这不是问题,即使在我从后台返回后,搜索标记位于正确的位置,您可以将它移动到滚动条上的任何位置,但您仍然会看到黑色屏幕直到播放被按下
  • play() 是做什么的?不是MediaPlayer.play(),而是你的play()。它会重新启动视图吗?
【解决方案2】:

我唯一的解决方案是播放和暂停视频,但只有在准备好之后。

关于我的主要活动

@Override
public void onResume() {
    if (mVideoPlayerController != null) {
        mVideoPlayerController.resume();


        if (mVideoPlayerController.isContentStarted())
            if (isPlayedBeforePaused) {
                mVideoPlayer.play();
            } else {
                // set pause request will notify on prepare to play and pause
                // this fix the bug that on pause when return from background it shows black screen
                mVideoPlayerController.mVideoTracker.setPauseRequest();
            }

    }
    super.onResume();
}

在我的视频跟踪器上(视频视图)

super.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mMediaPlayer = mp;
        if (mPauseRequest) {
            play();
            pause();
            mPauseRequest = false;
        }
    }
});

我知道这不是最好的方法,但我发现最好的方法是没有错误并且存在这样的事情(-:

希望对某人有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多