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
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
@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
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