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截图视频未打开。我不得不把工具栏从这里移除。这种情况不会发生