更改方向的单活动应用中的YouTubePlayerSupportFragment

我试图解决这个问题,通过互联网搜索,没有find真正的答案。

我正在开发一款需要YouTube播放器的应用。 此播放器是YouTubePlayerSupportFragment因为它位于支持片段中(因此它也是嵌套的)。 初始设置后,我意识到每当我旋转手机时,video就会停止播放,必须重新启动。 这显然不是我想要的。

然后我发现了一些SO答案( 像这样 ),人们说Activity需要处理配置更改,所以我在清单中的Activity中添加了android:configChanges="keyboardHidden|orientation|screenSize" 。 这解决了这个问题,video现在即使在方向改变时也能继续播放,全屏旋转看起来并不难看。 很酷,我说,只是意识到这大大困扰了应用程序的其他部分,因为配置现在正在所有视图到位更新。 这意味着如果我的手机处于纵向模式并且我将其旋转为横向,则正在使用的布局仍然是纵向布局。

我find了解决方案,建议在Activity的onConfigurationChanged(...)调用setContentView(...)并重新onConfigurationChanged(...)片段中的视图,但这似乎是一个相当麻烦的解决方案,因为它不仅仅是一个简单的内容设置我需要,片段需要保留(例如在RecyclerView滚动位置)。 内置的setRetainInstance(true)在这种情况下不起作用,因为视图将使用它重新创建,但是在调用onCreateView(...)时配置仍然是旧的。

如果我可以捕获configChanges事件,如果用户仅在该屏幕(片段)上但在其他任何地方保留Activity娱乐,那将是很好的。

不建议使用更多活动,由于UI / UX原因,我无法为此屏幕和应用程序的其余部分使用单独的活动。

根据此 YouTube Android播放器API指南

建议您手动处理由活动中的方向引起的配置更改,以避免每次配置更改时重新创建此片段的视图。 为了获得最佳用户体验,您还应该通过更改活动的布局来手动处理全屏事件。(请参阅第二个approch)

由于您已经在自己处理配置更改,我可以看到您的问题的两种可能的解决方案。

  1. 将setFullscreenControlFlags (到您的YouTubePlayer对象)设置为FULLSCREEN_FLAG_ALWAYS_FULLSCREEN_IN_LANDSCAPE (这将导致播放器在设备进入横向时自动进入全屏。)与FULLSCREEN_FLAG_CONTROL_ORIENTATION (启用方向的自动控制。)标志一起使用。

请注意,只有在您的活动以纵向方式锁定时才应设置此标志(并在清单中指定为此标志)。

如果您没有活动的横向布局,但希望仅为全屏video观看启用横向打印,则该标志非常有用。

  1. 这种方法可能会解决您的问题,正如我上面提到的那样,官方文档也提出了这一建议。 在setFullscreenControlFlags方法中设置setFullscreenControlFlags ,它禁用默认的全屏布局处理程序,使您可以手动控制到全屏布局的转换。 除了使您能够实现自定义全屏布局之外,此选项还提供了避免在默认全屏行为中发生的重新缓冲的优势。

实现自定义全屏行为的应用程序应确保两件事

每当调用onFullscreen(boolean)时,播放器的视图占用应用程序窗口的整个可用空间。 当方向更改为横向时,不会重新创建活动。 要为支持纵向的活动实现此目的,您需要指定您的活动在应用程序的清单中自行处理某些配置更改,包括orientation,keyboardHidden和screenSize。

请参阅此处了解如何使用此标志。

根据我分享的第一个链接 ,第二种方法将避免每次配置更改时重新创建片段的视图。 此外,您不需要在onConfigurationChanged(...)调用setContentView(...) onConfigurationChanged(...)

希望这会帮助你。