【发布时间】:2012-05-21 02:51:50
【问题描述】:
是否可以让应用程序在定向后保留缓冲区而无需手动处理配置更改。
场景基本:
当方向改变时,应保留直到最新点的视频缓冲区。
需要重新加载一个新的布局(因为纵向和横向有不同的布局), 因此,让应用重新启动 Activity 以重新加载新资源是我认为的最佳方式。
视频组件在片段中。
我尝试过但不可接受的替代方案:
第一个解决方法是保存视频的位置,创建视图后,使用 seekTo 转到最后一点。但是,这会导致设备再次重新缓冲。
我尝试过使用片段 setRetainInstance(true) 并确保媒体播放器在方向更改后不会重新初始化。在每个 onCreateView 之后,我只是将 mediaplayer.setDisplay() 设置为一个新的surfaceholder。不幸的是,这会导致媒体播放器进入错误状态,进而需要重置媒体播放器。
对此有何建议/解决方法?
已编辑:我在 stackoverflow 的某处看到您可以在媒体播放器在 android 4.0+ 中处于活动状态时更改媒体播放器表面支架。但是,我正在为 android 3.x 开发一个应用程序。
【问题讨论】:
-
看看我的回答here有没有帮助。
-
@yorkw 但这意味着破解 android.jar。正确的?你知道有什么方法可以为主流做吗?还要确保 Play 商店接受它?
-
要么破解 VideoView 的副本(不是实际的 android.jar),要么从 MediaPlayer 构建自己的 VideoView,这里的关键是要正确避免导致重新缓冲或清理缓冲区的方法调用配置更改(更重要的是,在 Activity 的生命周期回调方法和 SurfaceHolder 回调方法中)。
-
我在片段中使用媒体播放器,我对你的第二个答案很好奇。活动是否重新启动?如果是这样,那么每次活动都会重新初始化活动并导致表面视图重新初始化。如果此时媒体播放器处于暂停状态,调用 mediaplayer.start() 将使其自身进入错误状态。由于我将视频放在片段中,因此我尝试了 2 个场景,重新初始化 SurfaceView 而不是。当我重新初始化时,它会进入错误状态,当我不是时,不会显示任何内容,因为没有绘制视图。
-
@Maziz,你认为 callign invalidate() 或 requestLayout() 怎么样?它是否解决了您的“未绘制视图”问题?
标签: android screen-orientation