无论如何,您可以让应用程序在方向之后保留缓冲区,而无需手动处理配置更改。
基本情景:
当方向发生变化时,视频缓冲区应保留到最新点。
需要重新加载新布局(因为portait和lanscape具有不同的布局), 因此,让app重新启动活动以重新加载新资源是我认为最好的方法。
视频组件位于片段中。
我尝试但不接受的替代方案:
第一个解决方法是保存视频的位置,在创建视图后,使用seekTo转到最后一个点。但是,这将导致设备再次重新缓冲。
我尝试使用片段setRetainInstance(true),并确保在方向更改后媒体播放器不会重新初始化。在每个onCreateView之后,我只需将mediaplayer.setDisplay()设置为新的surfaceholder。不幸的是,这导致媒体播放器进入错误状态,这又需要重置媒体播放器。
对此有何建议/解决方法?
编辑:我在stackoverflow中看到某个地方你可以在android 4.0+中激活媒体播放器时更改媒体播放器表面持有者。但是,我正在为android 3.x开发一个应用程序。
答案 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中旋转时可以保留缓冲区。 这些是可用的选项:
允许轮播和活动重新播放,但保存视频位置。这将松开缓冲区,但允许您从最后一个位置继续。这不适用于实时流,仅适用于本地文件或远程VOD。您必须在onSaveInstanceState
中保存您的位置,并在onCreate
中将其恢复为活动/片段。或者使用setRetainInstance(true)
保留该值,但不建议使用最后一个选项。
使用android:configChanges="orientation|screenSize"
标记并自行管理UI大小更改。请查看此POC作为参考:https://github.com/caspercba/POCMediaPlayerRotation
去寻找像NexStreaming这样的第三方玩家。
干杯