8

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

场景基本上:

  1. 当方向改变时,应保留直到最新点的视频缓冲区。

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

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

我尝试过但不可接受的替代方案:

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

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

对此有任何建议/解决方法吗?

编辑:我在stackoverflow的某个地方看到你可以在媒体播放器在android 4.0+中处于活动状态时更改媒体播放器表面支架。但是,我正在为 android 3.x 开发一个应用程序。

4

3 回答 3

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);
}
于 2013-08-30T14:43:39.163 回答
0

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

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

于 2012-05-21T03:29:33.260 回答
0

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

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

  2. 使用android:configChanges="orientation|screenSize"标志并管理自己的 UI 大小更改。看看这个 POC 作为参考:https ://github.com/caspercba/POCMediaPlayerRotation

  3. 选择像 NexStreaming 这样的第三方播放器。

干杯

于 2015-07-17T00:11:27.020 回答