2017-05-26 45 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