Skip to content

WebView Height Issue: Correct in Emulator, Too Small on Real Device #1888

@SANOONAS

Description

@SANOONAS

Hello sir,

I'm having an issue with the WebView filter. It's showing two different outputs: the emulator displays the correct output, but on the real device, the loaded page appears with insufficient height.

EMULATOR OUTPUT (LD PLAYER)

Image

REAL DEVICE OUTPUT (OPPO F19, SUMSUNG TAB, SAMSUNG M02)

Image

CODE

private void setBrowser() {
// Inflate custom layout that contains the WebView
View view = LayoutInflater.from(requireContext()).inflate(R.layout.browser_ui, null);
// Safety check in case view is reused
if (view.getParent() != null) {
((ViewGroup) view.getParent()).removeView(view);
}

    WebView webView = view.findViewById(R.id.main);
    webView.setBackgroundColor(Color.TRANSPARENT);
    // Configure WebView settings
    WebSettings settings = webView.getSettings();
    settings.setJavaScriptEnabled(true);
    settings.setDomStorageEnabled(true);
    settings.setUseWideViewPort(true);
    settings.setLoadWithOverviewMode(true);
    settings.setSupportZoom(true);
    settings.setBuiltInZoomControls(true);
    settings.setDisplayZoomControls(false);
    settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);

    // WebView client setup
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            Log.d(WBT, "Page started loading: " + url);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            Log.d(WBT, "Page finished loading: " + url);

            // Set transparent background
            view.evaluateJavascript(
                    "javascript:(function() {" +
                            "document.documentElement.style.background = 'transparent';" +
                            "document.body.style.background = 'transparent';" +
                            "document.body.style.backgroundColor = 'transparent';" +
                            "})()", null);

            // Inject custom meta viewport tag and size
            float initialScale = 0.3f;
            float width = 16;
            float height = 9;

            String javascript =
                    "javascript:(function() {" +
                            "  var meta = document.querySelector('meta[name=viewport]');" +
                            "  if (meta) {" +
                            "    meta.setAttribute('content', 'width=" + width +
                            ", height=" + height + ", initial-scale=" + initialScale +
                            ", maximum-scale=3.0, user-scalable=no');" +
                            "  } else {" +
                            "    var newMeta = document.createElement('meta');" +
                            "    newMeta.name = 'viewport';" +
                            "    newMeta.content = 'width=" + width + ", height=" + height +
                            ", initial-scale=" + initialScale + ", maximum-scale=3.0, user-scalable=no';" +
                            "    document.getElementsByTagName('head')[0].appendChild(newMeta);" +
                            "  }" +
                            "  document.body.style.width = '" + width + "px';" +
                            "  document.body.style.height = '" + height + "px';" +
                            "})()";

            webView.evaluateJavascript(javascript, new ValueCallback<String>() {
                @Override
                public void onReceiveValue(String value) {
                    Log.e(WBT, "onReceiveValue: " + value);
                    // Optional: Handle JS response
                }
            });
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
            Log.e(WBT, "WebView error: " + errorCode + " - " + description + " - " + failingUrl);
        }
    });

    // Enable console messages
    webView.setWebChromeClient(new WebChromeClient() {
        @Override
        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
            Log.d(WBT, consoleMessage.message()
                    + " -- From line " + consoleMessage.lineNumber()
                    + " of " + consoleMessage.sourceId());
            return true;
        }
    });

    // Load the URL
    webView.loadUrl("https://mycric.app/overlay/685d2548de1cbd57ee87907c/685d344ede1cbd57ee87c7bf");

    // Get dimensions with fallback
    Point previewSize = genericStream.getGlInterface().getEncoderSize();
    int sizeSpecWidth = View.MeasureSpec.makeMeasureSpec(previewSize.x, View.MeasureSpec.EXACTLY);
    int sizeSpecHeight = View.MeasureSpec.makeMeasureSpec(previewSize.y, View.MeasureSpec.EXACTLY);

    view.measure(sizeSpecWidth, sizeSpecHeight);
    view.layout(0, 0, previewSize.x, previewSize.y);

    Log.i(WBT,"ssw "+sizeSpecWidth+" ssh "+sizeSpecHeight);
    Log.i(WBT,"ssw "+previewSize.x+" ssh "+previewSize.y);

    // Apply the filter
    AndroidViewFilterRender androidViewFilterRender = new AndroidViewFilterRender();
    androidViewFilterRender.setView(view);
    androidViewFilterRender.setPosition(0,0);
    genericStream.getGlInterface().setFilter(androidViewFilterRender);
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions