2016-03-10 101 views
1

我在我的應用程序中使用YoutubePlayerSupportFragment。我正在添加YouTubePlayer.FULLSCREEN_FLAG_CUSTOM_LAYOUT標誌。從documentation我知道我的播放器在全屏退出後不會再次觸發,但現在我必須處理Action Bar和Navigation Bar。但文件沒有說或指出我如何處理這些案件。YoutubePlayer - 導航欄覆蓋

現在我面對的問題到目前爲止只發生在華碩Nexus 7操作系統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,他們不會拋出覆蓋錯誤。在日誌貓中,我收到以下消息。

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()並獲得Click事件我的自我,但即使不幫我擺脫導航時間棒(實際上是在時間之前)。

我也嘗試通過OnSystemUiVisibilityChangeListener偵聽系統UI更改並在其中隱藏導航欄(但可能爲時尚未隱藏導航欄)。

我在Android清單文件中設置了android:theme="@style/Theme.AppCompat.NoActionBar",所以我並不需要隱藏動作/狀態欄只是導航欄。

此外,如果任何人都可以確認它是設備特定的問題,這將是一個很大的幫助。

+0

我使用了YouTube,並注意到如果他在屏幕上的空間很小,玩家會看到奇怪的。例如,我沒有開啓工作或者不開啓截屏視頻。我不得不從這裏刪除工具欄。這不會發生在所有設備 – PeDuCKA

+0

@PeDuCKA我的道歉,但我不明白你的意見。你可以換個方式嗎?你也可以說所有設備都不會出現這個問題:你可以說它在哪些設備上(設備分類或固定數量的設備)?此外,如果有問題的解決辦法,請告訴。 – Abbas

+0

對不起,遲到的迴應,但不知何故,我沒有收到通知。 – Abbas

回答

0

所以這是如何解決這個問題(這仍然不是一個解決方案,但它最接近我可以達到)。

因此,我在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還增加了Immersive模式,因此該解決方案在此之前不適用於任何設備,但我只在運行API 21的設備上遇到問題。所有較舊的設備運行良好。另外如果/當Navigation Bar停留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(); 
} 
+0

我會嘗試解決方案,讓你知道它是否比我的更好。謝謝! – Abbas

+0

@Tony,不工作! –