2017-05-26 1 views
5

J'essaie d'implémenter une sous-classe de WebChromeClient afin d'avoir un bouton plein écran en fonctionnement sur les liens vidéo youtube embed (ex: https://www.youtube.com/embed/dQw4w9WgXcQ) dans un WebView.Le bouton plein écran de la vidéo à l'intérieur de WebView ne fonctionne pas

I essentiellement simplifiée this repo, voici quelques extraits:

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

Il fonctionne correctement sur KitKat b Je ne suis pas sur Nougat (Je n'ai que ces deux appareils à tester): quand j'appuie sur le bouton plein écran, il passe parfois en plein écran, mais la plupart du temps il "clignote" et ne reste pas en plein écran.

Et puis, quand il est en fait en mode plein écran, le bouton pour quitter fullscreen ne fonctionne pas (onHideCustomView est pas appelé du tout)

Vous pouvez voir que je mets les journaux et a remarqué que lorsque le « flash » arrive, onHideCustomView est effectivement appelé juste après onShowCustomView ("ENTER FULLSCREEN" puis immédiatement "EXIT FULLSCREEN"), je ne comprends pas pourquoi.

Merci beaucoup si quelqu'un peut me diriger vers une solution

+0

Juste un avis basé sur mes expériences et mes recherches: oubliez webview pour faire face à des vidéos youtube: s'étendant sur une bonne API Youtube, vous vous libérez de la mise à jour surprenante de chaque semaine. – statosdotcom

+0

@statosdotcom oui J'aimerais l'ouvrir dans l'application YouTube, mais je ne peux pas le faire puisque l'objectif est d'afficher une seule vidéo et d'éviter d'en suggérer d'autres. – CyrilFind

+0

Peut-être que l'API peut offrir une certaine configuration pour vous, permettant un réglage fin. Je pense que vous devriez y jeter un coup d'oeil. Bonne chance – statosdotcom

Répondre

0

je également face à la même question, mais je l'ai fixé après avoir passé des heures dessus.

Tout ce que vous avez à faire est de définir la chaîne UserAgent d'un périphérique KitKat. Et c'est tout!

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

Cela corrigera tout le bizarre fonctionnement de onShowCustomView() et onHideCustomView() sur les appareils plus récents. J'espère que ça aide.

+0

ne fonctionne pas avec moi. – User9527

+0

Ceci est plus d'une solution de contournement mais merci, je garderai cela à l'esprit si je travaille à nouveau sur ce sujet. – CyrilFind