Android YouTubeplyer-导航栏覆盖
我正在应用程序中使用Android YouTubeplyer-导航栏覆盖,android,android-youtube-api,Android,Android Youtube Api,我正在应用程序中使用YoutubePlayerSupportFragment。我正在添加YouTubePlayer.FULLSCREEN\u FLAG\u CUSTOM\u布局FLAG。从一开始,我知道我的播放器在退出全屏后不会拒绝,但现在我必须处理动作栏和导航栏。但文档没有说明或指出我如何处理这些案例 目前为止,我面临的问题只发生在华硕Nexus7OS5.1.1中。我还有一个LG G2 D802 OS 4.4.2、三星Galaxy TAB GT P5113 OS 4.4.2和三星Galaxy
YoutubePlayerSupportFragment
。我正在添加YouTubePlayer.FULLSCREEN\u FLAG\u CUSTOM\u布局
FLAG。从一开始,我知道我的播放器在退出全屏后不会拒绝,但现在我必须处理动作栏和导航栏。但文档没有说明或指出我如何处理这些案例
目前为止,我面临的问题只发生在华硕Nexus7OS5.1.1中。我还有一个LG G2 D802 OS 4.4.2、三星Galaxy TAB GT P5113 OS 4.4.2和三星Galaxy TAB SM-T310 OS 4.2.2,它们不会抛出覆盖错误。在日志猫中,我得到以下消息
03-09 15:54:39.760 11203-11203/com.jadoo.jadooplus W/YouTubeAndroidPlayerAPI﹕
YouTube video playback stopped due to unauthorized overlay on top of player.
The YouTubePlayerView is obscured by android.view.View{c067400 V.ED.... ........ 0,736-1280,800 #1020030 android:id/navigationBarBackground}.
Top edge 24 px above YouTubePlayerView's bottom edge. .
所以我知道问题出在导航栏上。导航栏覆盖在播放器顶部
我的问题是
- 为什么我在其他设备上没有收到相同的错误李>
- 如何处理系统导航栏,以便当我在全屏时,如果/当我想停止播放机(在后按)而不将其覆盖在播放机上时,仍然可以获得导航栏
dispatchTouchEvent()
,并获取自己的单击事件,但即使这样也无法帮助我及时(在实际时间之前)摆脱导航栏
我还尝试通过onSystemActivityChangeListener
监听系统UI的更改,并在那里隐藏导航栏(但现在隐藏导航栏可能还为时过早)
我已经在android清单文件中设置了android:theme=“@style/theme.AppCompat.NoActionBar”
,所以我不需要将操作/状态栏隐藏在导航栏中
另外,如果有人能确认这是特定于设备的问题,这将是一个很大的帮助。所以这就是解决问题的方法(这仍然不是一个解决方案,但它是我能找到的最接近的)
因此,我在YoutubePlayerSupportFragment
(或youtubeplayersfragment
)的onInitializationSuccess
中添加了一个OnSystemUiChangeListener
)
提供一个OnSystemUiChangeListener
的实现对象
重写系统上的方法onSystemVivibilityChange()
,如下所示:
@Override
public void onSystemUiVisibilityChange(int visibility) {
if (visibility == View.SYSTEM_UI_FLAG_VISIBLE) {
scheduleNavigationBarHide();
}
else if (visibility == View.SYSTEM_UI_FLAG_HIDE_NAVIGATION || visibility == View.SYSTEM_UI_FLAG_LOW_PROFILE
|| visibility == View.SYSTEM_UI_FLAG_FULLSCREEN) {
if (navigationBarHandler != null) {
navigationBarHandler.cancel();
navigationBarHandler.purge();
navigationBarHandler = null;
}
}
}
提供scheduleNavigationBarHide()方法的定义
因此,最后,hideAsImmersiveNavigationBar()
正如您可能猜到的那样,这是通过使导航栏
暂时沉浸式来实现的。这是怎么做的
private void hideAsImmersiveNavigationBar(Activity activity) {
if(activity != null)
{ View decorView = activity.getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE;
decorView.setSystemUiVisibility(uiOptions);
}
}
稍后,当播放器关闭时,您可能需要返回导航栏
。将UI标志更改为int-uiOptions=View.SYSTEM_UI_FLAG_VISIBLE | View.SYSTEM_UI_FLAG_全屏代码>
最后一点免责声明:我提供了应用程序已测试的设备列表,我不知道这是否适用于所有设备。如果您确实发现了一个问题持续存在的设备,请随时发表评论。此外,从API 19中添加了浸入式模式,因此解决方案在此之前不会在任何设备上运行,但我只在一个运行API 21的设备上遇到了问题。所有的旧设备都运行良好。此外,如果导航栏停留1秒,我们仍然会得到覆盖错误。因此这就是解决问题的方法(这仍然不是一个解决方案,但是我能找到的最接近的方法)
因此,我在YoutubePlayerSupportFragment
(或youtubeplayersfragment
)的onInitializationSuccess
中添加了一个OnSystemUiChangeListener
)
提供一个OnSystemUiChangeListener
的实现对象
重写系统上的方法onSystemVivibilityChange()
,如下所示:
@Override
public void onSystemUiVisibilityChange(int visibility) {
if (visibility == View.SYSTEM_UI_FLAG_VISIBLE) {
scheduleNavigationBarHide();
}
else if (visibility == View.SYSTEM_UI_FLAG_HIDE_NAVIGATION || visibility == View.SYSTEM_UI_FLAG_LOW_PROFILE
|| visibility == View.SYSTEM_UI_FLAG_FULLSCREEN) {
if (navigationBarHandler != null) {
navigationBarHandler.cancel();
navigationBarHandler.purge();
navigationBarHandler = null;
}
}
}
提供scheduleNavigationBarHide()方法的定义
因此,最后,hideAsImmersiveNavigationBar()
正如您可能猜到的那样,这是通过使导航栏
暂时沉浸式来实现的。这是怎么做的
private void hideAsImmersiveNavigationBar(Activity activity) {
if(activity != null)
{ View decorView = activity.getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE;
decorView.setSystemUiVisibility(uiOptions);
}
}
稍后,当播放器关闭时,您可能需要返回导航栏
。将UI标志更改为int-uiOptions=View.SYSTEM_UI_FLAG_VISIBLE | View.SYSTEM_UI_FLAG_全屏代码>
最后一点免责声明:我提供了应用程序已测试的设备列表,我不知道这是否适用于所有设备。如果您确实发现了一个问题持续存在的设备,请随时发表评论。此外,从API 19中添加了浸入式模式,因此解决方案在此之前不会在任何设备上运行,但我只在一个运行API 21的设备上遇到了问题。所有的旧设备都运行良好。另外,如果导航栏停留1秒,我们仍然会得到覆盖错误。当youtube全屏时,将活动更改为全屏
void toggleFullScreen(boolean goFullScreen){
if(goFullScreen){
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
}else{
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
yourView.requestLayout();
}
当youtube全屏时,将活动更改为全屏
void toggleFullScreen(boolean goFullScreen){
if(goFullScreen){
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
}else{
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
yourView.requestLayout();
}
我使用了YouTube,注意到如果他在屏幕上留下一点空间,玩家就会看到奇怪的东西。例如,我没有打开活动或ful截图视频未打开。我不得不把工具栏从这里移除。这根本不会发生devices@PeDuCKA我很抱歉,但我不理解你的评论。你能重新措辞吗?您还说这个问题并非在所有设备上都会发生:您能说它发生在哪些设备上(设备分类或固定数量的设备)吗?另外,如果有解决问题的方法,请一定告诉我。很抱歉反应太晚,但不知何故我没有收到通知。请参阅另一个答案@PeDuCKA,我仍然不明白。我的问题完全不同。我并不是试图在YoutubePlayerSupportFragment上面画出我自己的任何观点。是导航栏过来了。我在YouTube上看到,如果他在屏幕上留下一点空间,玩家就会觉得奇怪。例如,我没有打开活动或ful截图视频未打开。我不得不把工具栏从这里移除。这种情况不会发生