【问题标题】:Video Freeze after lock screen on SurfaceView using SurfaceView and MediaPlayer使用 SurfaceView 和 MediaPlayer 在 SurfaceView 上锁定屏幕后视频冻结
【发布时间】:2014-07-24 15:43:01
【问题描述】:

我尝试使用 SurfaceView 和 MediaPlayer 在 Android 上显示视频。

我现在遇到一个错误,如果我按电源按钮锁定屏幕然后解锁它,MediaPlayer 上显示的视频消失了,只有声音。通常在这种情况下,在我锁定手机之前,surfaceView 会以某种方式冻结到视频的最后一帧。

当我隐藏屏幕时它可以正常工作(例如回家并打开另一个应用程序)但是当我锁定手机时它就不起作用了。我认为他们都通过了 onPause 和 onResume 所以我不明白为什么会有不同的逻辑。

我想知道有没有办法解决我的问题。

谢谢!

【问题讨论】:

    标签: android video android-mediaplayer surfaceview surfaceholder


    【解决方案1】:

    我不确定到底发生了什么,但有一类问题可能是您遇到问题的原因。

    如果您的锁屏与方向无关,或者希望与设备的方向相同,则不会重新启动 Activity 以更改方向。在这种情况下,使用电源按钮关闭并重新打开显示器不会导致 SurfaceView 的表面被破坏。因此,如果您的应用依赖 surfaceCreatedsurfaceChanged 回调来触发事情发生,那么事情就不会发生。

    如果您离开 Activity 并返回,Surface 会被销毁并重新创建。

    Activity生命周期和Surface生命周期的关系有点复杂;你可以在this article 中找到一些关于它的注释,包括构建应用程序的两个基本模式。 SurfaceView 管理的两种“风格”示例可以在Grafika 中找到。

    如果不知道你的应用是如何工作的,我无法给出具体的建议,但主要是你只需要看看你的应用在 Activity 和 Surface 生命周期不是紧密耦合的想法下做了什么。

    【讨论】:

    • 感谢您的回复!我在 surfaceChangedsurfaceCreated 下唯一拥有的是 mMediaPlayer.setDisplay(myHolder); 。我将它添加到不是 surfaceCreatedsurfaceChanged 的其他地方。但问题依然存在。
    • 我猜想在 Activity 暂停/恢复时正在重新创建 mMediaPlayer,但由于没有重新创建 Surface,因此没有调用 setDisplay()。您需要再次调用setDisplay(),这意味着您需要保留从surfaceCreated 回调获得的SurfaceHolder 的句柄。有关示例,请参阅 github.com/google/grafika/blob/master/src/com/android/grafika/… - 它使 SurfaceHolder 保持静态。
    【解决方案2】:

    好的,我以一种奇怪的方式解决了这个问题,我认为这可能是 Android 的一个错误。没有时间对此进行足够的测试。

    首先,正如@fadden 所说,您需要在 surfaceChangedsurfaceCreated 之外的其他地方有一个mMediaPlayer.setDisplay(myHolder),因为从锁定屏幕恢复时可能不会调用它们。

    对我来说,以这种方式更改后问题仍然存在。这是我解决问题的更改:我们应该使用 mMediaPlayer = MediaPlayer.create(MediaActivity.this, fileUri) 而不是 mMediaPlayer = new MediaPlayer()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      相关资源
      最近更新 更多