Dayo
Dayo

Reputation: 51

Android webview don`t display video

Is android webview able to display mp4 video with video tag?

In my application, my webview need to display video in . But, my webview is displays only blackscreen(audio is working fine).

I`m working in Android API Level 29.

This is my code about settings of webview

mWebSettings = mWebView.getSettings();
        mWebSettings.setJavaScriptEnabled(true); 
        mWebSettings.setSupportMultipleWindows(true);
        mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true); 
        mWebSettings.setLoadWithOverviewMode(true); 
        mWebSettings.setUseWideViewPort(true); 
        mWebSettings.setSupportZoom(true); 
        mWebSettings.setBuiltInZoomControls(true); 
        mWebSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); 
        mWebSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); 
        mWebSettings.setDomStorageEnabled(true); 
        mWebSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        mWebSettings.setMediaPlaybackRequiresUserGesture(false);
        mWebSettings.setPluginState(WebSettings.PluginState.ON);
        mWebSettings.setAllowUniversalAccessFromFileURLs(true);
        mWebSettings.setAllowFileAccessFromFileURLs(true);
        mWebSettings.setAllowFileAccess(true);

        mWebSettings.setUserAgentString("Mozilla/5.0 (Linux; Android 10; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.185 Mobile Safari/537.36");

        mWebView.setBackgroundColor(0x00000000);
        mWebView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);

mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    view.loadUrl(request.getUrl().toString());
                }
                return super.shouldOverrideUrlLoading(view, request);
            }
        });

        mWebView.setWebChromeClient(new WebChromeClient() {
            @SuppressLint("SetJavaScriptEnabled")
            @Override
            public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
                // Dialog Create Code
                WebView newWebView = new WebView(MainActivity.this);
                WebSettings webSettings = newWebView.getSettings();
                webSettings.setJavaScriptEnabled(true);
                newWebView.setVisibility(View.GONE);
                final Dialog dialog = new Dialog(MainActivity.this);
                dialog.setContentView(newWebView);

                ViewGroup.LayoutParams params = dialog.getWindow().getAttributes();
                params.width = ViewGroup.LayoutParams.MATCH_PARENT;
                params.height = ViewGroup.LayoutParams.MATCH_PARENT;
                dialog.getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);
                //dialog.show();
                newWebView.setWebChromeClient(new WebChromeClient() {
                    @Override
                    public void onCloseWindow(WebView window) {
                        dialog.dismiss();
                    }
                });

                // WebView Popup에서 내용이 안보이고 빈 화면만 보여 아래 코드 추가
                newWebView.setWebViewClient(new WebViewClient() {
                    @Override
                    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                        return false;
                    }

                    @Override
                    public void onPageFinished(WebView view, String url) {
                        super.onPageFinished(view, url);
                        mWebView.loadUrl(view.getUrl());
                    }

                });

                ((WebView.WebViewTransport) resultMsg.obj).setWebView(newWebView);
                resultMsg.sendToTarget();
                //Log.d(MainURL,newWebView.getUrl());
                return true;

            }

            @SuppressLint("SetJavaScriptEnabled")
            @Override
            public void onCloseWindow(WebView window) {
                super.onCloseWindow(window);
                window.goBack();
            }


        });

And I use mWebView.loadUrl(url) to load my url.

Upvotes: 0

Views: 948

Answers (1)

Chaitanya Karmarkar
Chaitanya Karmarkar

Reputation: 1595

mWebView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);

This line is the cause of your problem. Video playback will not work when layer type is software. So change it either to LAYER_TYPE_NONE or LAYER_TYPE_HARDWARE like:

mWebView.setLayerType(WebView.LAYER_TYPE_HARDWARE , null);

or

mWebView.setLayerType(WebView.LAYER_TYPE_NONE, null);

Quick tip: Search more on internet regarding differences between various layer types and their performance and other aspects and then only use them wisely.

Upvotes: 1

Related Questions