2017-05-26 47 views
5

我想實現WebChromeClient的一個子類,以便在YouTube上有一個工作的全屏按鈕在WebView中嵌入視頻鏈接(例如:https://www.youtube.com/embed/dQw4w9WgXcQ)。WebView中的視頻全屏按鈕不工作

我基本上簡化this repo,這裏有一些片段:

VideoWebChromeClient:

public class VideoWebChromeClient extends WebChromeClient { 
    private boolean isVideoFullscreen = false; 
    private View activityNonVideoView; 
    private ViewGroup activityVideoView; 
    private View videoViewContainer; 
    private CustomViewCallback videoCallback; 
    private Window videoWindow; 

    public VideoWebChromeClient(View activityNonVideoView, ViewGroup activityVideoView, Window window) { 
     this.activityNonVideoView = activityNonVideoView; 
     this.activityVideoView = activityVideoView; 
     this.videoWindow = window; 
    } 

    @Override 
    public void onShowCustomView(View view, CustomViewCallback callback) { 
     Log.w("ENTER FULLSCREEN"); 
     videoCallback = callback; 
     videoViewContainer = view; 
     videoWindow.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     activityNonVideoView.setVisibility(View.GONE); 
     activityVideoView.addView(videoViewContainer, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
     activityVideoView.setVisibility(View.VISIBLE); 
     isVideoFullscreen = true; 
    } 

    @Override 
    public void onHideCustomView() { 
     if (!isVideoFullscreen) { 
      return; 
     } 
     Log.w("EXIT FULLSCREEN"); 
     activityVideoView.setVisibility(View.GONE); 
     activityVideoView.removeView(videoViewContainer); 
     activityNonVideoView.setVisibility(View.VISIBLE); 
     videoWindow.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     videoViewContainer = null; 
     videoCallback.onCustomViewHidden(); 
     isVideoFullscreen = false; 
    } 

    public boolean onBackPressed() { 
     onHideCustomView(); 
     return isVideoFullscreen; 
    } 
    } 

WebViewActivity

public class WebViewActivity extends BaseActivity { 

    public static final String WEB_VIEW_URL_EXTRA = "URL"; 
    private boolean loadedFirstURL = true; 
    private VideoWebChromeClient mWebChromeClient; 

    @Bind(webview) 
    WebView mWebView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(provideLayoutId()); 
     String url = (String) getIntent().getSerializableExtra(WEB_VIEW_URL_EXTRA); 

     // Check if URL is YouTube/Vimeo 
     if (RegexHelper.isVideoURL(url)){ 
      // Allow Fullscreen 
      final View defaultLayout = findViewById(R.id.defaultLayout); 
      final View fullscreenLayout = findViewById(R.id.fullscreenLayout); 
      mWebChromeClient = new VideoWebChromeClient(defaultLayout, (ViewGroup) fullscreenLayout, getWindow()); 
      mWebView.setWebChromeClient(mWebChromeClient); 

      // Block external links 
      mWebView.setWebViewClient(new WebViewClient() { 
       @Override 
       public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        if (loadedFirstURL) { 
         loadedFirstURL = false; 
         return false; 
        } 
        return true; 
       } 
      }); 
     } 
     mWebView.getSettings().setJavaScriptEnabled(true); 
     mWebView.loadUrl(url); 
    } 

     @Override 
     public void onBackPressed() { 
      if (!mWebChromeClient.onBackPressed()) 
      { 
       if (mWebView.canGoBack()) { 
        mWebView.goBack(); 
       } 
       else { 
        super.onBackPressed(); 
       } 
      } 
     } 
    } 

它的工作原理上正確奇巧 b不在牛軋糖(我只有這兩個設備進行測試):當我點擊全屏按鈕時,它有時會進入全屏,但大部分時間它「閃爍」,並保持不全屏。

然後,當它實際上是在全屏模式下,該按鈕退出全屏不起作用(onHideCustomView完全不叫)

你可以看到,我把日誌,發現當「閃光」發生,onHideCustomView實際上是onShowCustomView"ENTER FULLSCREEN"然後立即"EXIT FULLSCREEN")後立即調用,我不明白爲什麼。

非常感謝,如果有人可以點我朝着解決

+0

只是基於我的體驗和研究的一個觀點:忘記webview來處理youtube視頻:鋪設適當的Youtube API,你將釋放你每週驚人的更新。 – statosdotcom

+0

@statosdotcom是的,我想我可以在YouTube應用程序中打開它,但我不能這麼做,因爲目標是顯示一個視頻並避免提示其他人。 – CyrilFind

+0

也許API可以爲你提供一些配置,允許一些微調。我想你應該看看它。好運。 – statosdotcom

回答

0

我也面臨着同樣的問題,但我在花費小時後固定它。

您所要做的就是設置KitKat設備的UserAgent字符串。就是這樣!

private String userAgent = "Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/_BuildID_) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36"; 
mWebView.getSettings().setUserAgentString(userAgent); 

這將解決onShowCustomView(所有的怪異功能)onHideCustomView()上較新的設備。 希望它有幫助。

+0

不適合我。 – User9527

+0

這是更多的解決方法,但謝謝,如果我再次處理此問題,我會記住這一點。 – CyrilFind