2017-05-26 16 views
5

WebView内にYouTubeの埋め込みビデオリンク(例:https://www.youtube.com/embed/dQw4w9WgXcQ)のフルスクリーンボタンを表示するには、WebChromeClientのサブクラスを実装しようとしています。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が全く呼び出されません)

あなたは、私がログを入れてたときに、「フラッシュ」ということに気づいていることがわかります実際にonShowCustomViewの直後にonHideCustomViewが呼び出されました("ENTER FULLSCREEN"、次にすぐに"EXIT FULLSCREEN")、なぜ私は理解できません。

どうもありがとう誰もが解決策

+0

私の経験と研究に基づくちょうど意見:youtubeビデオを扱うためにwebviewを忘れてください:あなたは毎週の驚くべきアップデートからあなた自身を解放します。 – statosdotcom

+0

@statosdotcomはい私はYouTubeアプリでそれを開くことができますが、目的は1つの動画を表示し、他の動画を示唆しないためにできません。 – 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); 

これは、新しいデバイス上)と onHideCustomView()onShowCustomView(のすべての奇妙な機能を修正します。 お手伝いをしてください。

+0

は私の作品ではありません。 – User9527

+0

これは回避策ではありますが、ありがとうございます。 – CyrilFind

関連する問題