确保在方向更改后保留视频缓冲区,而无需手动处理onConfiguration更改

时间:2012-05-21 02:51:51

标签: android screen-orientation

无论如何,您可以让应用程序在方向之后保留缓冲区,而无需手动处理配置更改。

基本情景:

  1. 当方向发生变化时,视频缓冲区应保留到最新点。

  2. 需要重新加载新布局(因为portait和lanscape具有不同的布局), 因此,让app重新启动活动以重新加载新资源是我认为最好的方法。

  3. 视频组件位于片段中。

  4. 我尝试但不接受的替代方案:

    1. 第一个解决方法是保存视频的位置,在创建视图后,使用seekTo转到最后一个点。但是,这将导致设备再次重新缓冲。

    2. 我尝试使用片段setRetainInstance(true),并确保在方向更改后媒体播放器不会重新初始化。在每个onCreateView之后,我只需将mediaplayer.setDisplay()设置为新的surfaceholder。不幸的是,这导致媒体播放器进入错误状态,这又需要重置媒体播放器。

    3. 对此有何建议/解决方法?

      编辑:我在stackoverflow中看到某个地方你可以在android 4.0+中激活媒体播放器时更改媒体播放器表面持有者。但是,我正在为android 3.x开发一个应用程序。

3 个答案:

答案 0 :(得分:0)

我认为你可以覆盖onConfigurationChanged()并以编程方式重新布局。

您可以在不触及视频的情况下修改布局。

答案 1 :(得分:0)

也许你迟到了,但可能有其他人面临同样的问题。 您可以使用第二个选项。如果在销毁片段视图之前未将MediaPlayer的显示设置为null,则再次访问mediaplayer时它将进入错误状态。我的解决方案是实现surfaceholder的surfaceCreated和surfaceDestroyed事件。

@Override
public void surfaceCreated(SurfaceHolder holder) {
    mediaPlayer.setDisplay(holder);
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    mediaPlayer.setDisplay(null);
}

答案 2 :(得分:0)

我不认为在不使用android:configChanges标志的情况下在android中旋转时可以保留缓冲区。 这些是可用的选项:

  1. 允许轮播和活动重新播放,但保存视频位置。这将松开缓冲区,但允许您从最后一个位置继续。这不适用于实时流,仅适用于本地文件或远程VOD。您必须在onSaveInstanceState中保存您的位置,并在onCreate中将其恢复为活动/片段。或者使用setRetainInstance(true)保留该值,但不建议使用最后一个选项。

  2. 使用android:configChanges="orientation|screenSize"标记并自行管理UI大小更改。请查看此POC作为参考:https://github.com/caspercba/POCMediaPlayerRotation

  3. 去寻找像NexStreaming这样的第三方玩家。

  4. 干杯