YoutubePlayer - 导航栏叠加

时间:2016-03-10 06:34:27

标签: android android-youtube-api

我在我的应用程序中使用YoutubePlayerSupportFragment。我正在添加YouTubePlayer.FULLSCREEN_FLAG_CUSTOM_LAYOUT标志。从documentation我知道我的播放器在退出全屏后不会被拒绝,但现在我必须处理动作栏和导航栏。但是文档并没有说明或指出我如何处理这些案件。

现在我遇到的问题到目前为止只出现在华硕Nexus 7 OS 5.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,它们不会抛出Overlay Error。在Log cat中,我收到以下消息。

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. .

所以我知道导航栏中的 问题。导航栏覆盖在播放器顶部。

我的问题是这些

  • 为什么我在其他设备上没有得到相同的错误?
  • 我如何处理系统导航栏,这样当我全屏时,如果/当我想要停止播放器(在背面按下)而不将其覆盖在播放器上时,我仍然可以获得导航栏。

我尝试了点击事件但是在全屏模式下我无法获得任何内容我在活动中尝试了Overriding dispatchTouchEvent()并获得了我自己的点击事件,但即便如此&# 39;帮我摆脱导航栏的时间(实际上是在时间之前)。

我还尝试通过OnSystemUiVisibilityChangeListener监听系统UI更改并隐藏导航栏(但可能还为时过早隐藏导航栏)。

我在Android清单文件中设置了android:theme="@style/Theme.AppCompat.NoActionBar",因此我并不需要隐藏导航栏中的操作/状态栏。

此外,如果任何人都可以确认它是特定于设备的问题,那么它将是一个很好的帮助。

2 个答案:

答案 0 :(得分:0)

所以这就是解决这个问题的方法(这仍然不是一个解决方案,但它是我能找到的最接近的方法)。

所以,我在OnSystemUiChangeListener onInitializationSuccess(或YoutubePlayerSupportFragmentYoutubePlayerFragment中添加了(View) getView().getParent().setOnSystemUiVisibilityChangeListener();

OnSystemUiChangeListener

提供onSystemUiVisibilityChange()

的实施对象

覆盖方法@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; } } } ,如下所示:

private void scheduleNavigationBarHide() {


    if (navigationBarHandler != null) {
        Log.d(TAG, "Canceling navigationBarHandler.");
        navigationBarHandler.cancel();
        navigationBarHandler.purge();
        navigationBarHandler = null;
    }

    if (mContext != null && mContext instanceof JadooTVActivity) {
        navigationBarHandler = new Timer();

        navigationBarHandler.schedule(new TimerTask() {
            public void run() {
                ((JadooTVActivity) mContext).runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        if (!isPlayerSqueezed) {
                            hideAsImmersiveNavigationBar(Config.context);
                        }
                        else {
                            Utils.showNavigationBar(Config.context);
                        }
                    }
                });
            }
        }, 500);
    }
}

提供方法scheduleNavigationBarHide()的定义。

hideAsImmersiveNavigationBar()

所以最后Navigation Bar因为你可能已经猜到这是有用的,让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); } } 暂时沉浸其中。这是

的方式
Navigation Bar

稍后当玩家关闭时,你可能想要带回int uiOptions = View.SYSTEM_UI_FLAG_VISIBLE | View.SYSTEM_UI_FLAG_FULLSCREEN;。将UI标志更改为Navigation Bar

最后一点免责声明:我提供了应用程序已经过测试的设备列表,我不知道这是否适用于所有设备。如果您确实找到了问题持续存在的设备,请随时发表评论。此外,还在API 19中添加了沉浸式模式,因此该解决方案在此之前无法在任何设备上运行,但我只在一台运行API 21的设备上遇到此问题。所有旧设备都运行良好。此外,当<Window x:Class="WpfApplication2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApplication2" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <Storyboard x:Key="OnMouseDown1"> <DoubleAnimation Storyboard.TargetProperty="Width" Storyboard.TargetName="viewbox" From="{Binding ElementName=viewbox, Path=ActualWidth}" To="0" Duration="0:0:1"> </DoubleAnimation> </Storyboard> </Window.Resources> <Window.Triggers> <EventTrigger RoutedEvent="UIElement.MouseDown" SourceName="ellipse"> <BeginStoryboard Storyboard="{StaticResource OnMouseDown1}"/> </EventTrigger> </Window.Triggers> <Viewbox x:Name="viewbox"> <Ellipse x:Name="ellipse" Width="100" Height="100" Fill="Red"></Ellipse> </Viewbox></Window> 停留1秒钟时,我们仍会收到重叠错误。

答案 1 :(得分:0)

当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(); 
}