【问题标题】:YoutubePlayer - Navigation Bar OverlayYoutubePlayer - 导航栏覆盖
【发布时间】:2016-03-10 06:34:27
【问题描述】:

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

现在我面临的问题目前只发生在 Asus Nexus 7 OS 5.1.1 中。我还有一个 LG G2 D802 OS 4.4.2、Samsung Galaxy TAB GT P5113 OS 4.4.2 和 Samsung Galaxy Tab SM-T310 OS 4.2.2,它们不会抛出覆盖错误。在 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. .

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

我的问题是这些

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

我尝试侦听点击事件但在全屏模式下我无法获得任何结果,因此我在活动中尝试了OverridingdispatchTouchEvent() 并获得了我自己的点击事件,但即使这样也无助于我摆脱时间导航栏(实际上在时间之前)。

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

我已经在 android manifest 文件中设置了android:theme="@style/Theme.AppCompat.NoActionBar",所以我真的不需要只隐藏导航栏的操作/状态栏。

此外,如果有人能确认这是特定于设备的问题,那将是一个很大的帮助。

【问题讨论】:

  • 我使用 YouTube 并注意到如果他在屏幕上的空间很小,播放器会看到奇怪的。例如,我没有打开活动或完整的截图视频没有打开。我不得不从中删除工具栏。并非所有设备都会发生这种情况
  • @PeDuCKA 很抱歉,但我不明白您的评论。你能改写吗?您还说所有设备都不会出现此问题:您能说出它在哪些设备上发生(设备分类或固定数量的设备)吗?另外,如果有解决问题的方法,请告诉。
  • 抱歉回复晚了,但不知何故我没有收到通知。
  • @PeDuCKA 我还是不明白。我的问题完全不同。我不想在 YoutubePlayerSupportFragment 之上绘制任何我自己的观点。就是导航栏过来了。我无法解决我的问题或解决方法。

标签: android android-youtube-api


【解决方案1】:

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

所以,我在YoutubePlayerSupportFragment(或YoutubePlayerFragment)的onInitializationSuccess 中添加了一个OnSystemUiChangeListener

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

为方法 scheduleNavigationBarHide() 提供定义。

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

所以最后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。将 UI 标志更改为 int uiOptions = View.SYSTEM_UI_FLAG_VISIBLE | View.SYSTEM_UI_FLAG_FULLSCREEN;

最后一点免责声明:我提供了该应用程序已测试的设备列表,我不知道这是否适用于所有设备。如果您确实发现问题持续存在的设备,请随时发表评论。 API 19 还添加了沉浸式模式,因此该解决方案在此之前无法在任何设备上运行,但我只在一台运行 API 21 的设备上遇到问题。所有旧设备都运行良好。此外,如果/当 Navigation Bar 停留 1 秒时,我们仍然会收到覆盖错误。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我会尝试这个解决方案,如果它比我的效果更好,请告诉你。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2021-05-08
    • 2018-05-13
    • 2016-11-18
    相关资源
    最近更新 更多