最新消息:文章中包含代码时,请遵守代码高亮规范!

【原创】H5播放视频,全屏播放

Android 王 伟 82浏览 0评论

在工作中,无意遇到一个需求,要在WebView加载H5视频,支持全屏播放。
在Activity中添加需要的参数:

protected static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
private View customView;
private FrameLayout fullscreenContainer;
private WebChromeClient.CustomViewCallback customViewCallback;

之后给WebSetting设置属性:

WebSettings settings = mWebView.getSettings();
settings.setUseWideViewPort(true);
settings.setJavaScriptEnabled(true);
settings.setAllowFileAccess(true); // 允许访问文件
settings.setBuiltInZoomControls(true);
settings.setSupportZoom(true);
settings.setLoadWithOverviewMode(true);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);

然后设置WebView点击事件:

mWebView.setWebChromeClient(new WebChromeClient() {
     @Override
     public void onProgressChanged(WebView view, int newProgress) {
     }

     @Override
     public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
         callback.invoke(origin, true, false);
         super.onGeolocationPermissionsShowPrompt(origin, callback);
     }

     @Override
     public View getVideoLoadingProgressView() {
         FrameLayout frameLayout = new FrameLayout(MainActivity.this);
         frameLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
         return frameLayout;
     }

     @Override
     public void onShowCustomView(View view, CustomViewCallback callback) {
         showCustomView(view, callback);
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//播放时横屏幕,如果需要改变横竖屏,只需该参数就行了
     }

     @Override
     public void onHideCustomView() {
         hideCustomView();
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//这里设置不播放时,为横屏还是竖屏
     }
});

/** 隐藏视频全屏 */
private void hideCustomView() {
    if (customView == null) {
         return;
    }

    setStatusBarVisibility(true);
    FrameLayout decor = (FrameLayout) getWindow().getDecorView();
    decor.removeView(fullscreenContainer);
    fullscreenContainer = null;
    customView = null;
    customViewCallback.onCustomViewHidden();
    mWebView.setVisibility(View.VISIBLE);
}

/** 全屏容器界面 */
static class FullscreenHolder extends FrameLayout {

    public FullscreenHolder(Context ctx) {
        super(ctx);
        setBackgroundColor(ctx.getResources().getColor(android.R.color.black));
    }

    @Override
    public boolean onTouchEvent(MotionEvent evt) {
        return true;
    }
}

private void setStatusBarVisibility(boolean visible) {
    int flag = visible ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN;
    getWindow().setFlags(flag, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    switch (keyCode) {
        case KeyEvent.KEYCODE_BACK:
         /** 回退键 事件处理 优先级:视频播放全屏-网页回退-关闭页面 */
            if (customView != null) {
                hideCustomView();
            } else if (mWebView.canGoBack()) {
                mWebView.goBack();
            } else {
                finish();
            }
            return true;
         default:
            return super.onKeyUp(keyCode, event);
    }
}

转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/24537.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者Bob的打赏,我们会更加努力!    如果您想成为作者,请点我

您必须 登录 才能发表评论!