WebView定位29不显示内容

时间:2019-09-23 11:42:13

标签: android webview android-10.0

我有一个带有最新声明的应用程序:

compileSdkVersion 29
buildToolsVersion '29.0.2'
useLibrary 'org.apache.http.legacy'

defaultConfig {
    minSdkVersion 19
    targetSdkVersion 29
    ...

我的应用中也没有几个WebView-全尺寸ActivityFragment版本,还有一个固定大小的广告(例如300x300dp,水平居中){{1 }}与本机小部件一起放在列表中。在目标更新后,这最后一个不再加载了(只有这一个,其他所有都在工作),但是当我更改(还原)时,只需在网上进行以下操作:

View

它与更新前一样工作。此广告的整个 targetSdkVersion 28 设置如下:

WebView

请注意,在API 19(受支持的最低版本)上,webView = findViewById(R.id.ad_banner_webview); webView.setLayerType(Build.VERSION.SDK_INT <= 19 ? WebView.LAYER_TYPE_SOFTWARE : // on older devices non-fullactivity webview is blinking/glitching WebView.LAYER_TYPE_HARDWARE, null); webView.setBackgroundColor(Color.TRANSPARENT); final String userAgent = AppInfo.getInstance(webView.getContext()).getUserAgent(); webView.getSettings().setUserAgentString(userAgent); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setLoadWithOverviewMode(true); webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setTextZoom(100); webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); webView.setVerticalScrollBarEnabled(false); webView.setHorizontalScrollBarEnabled(false); webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); webView.setWebChromeClient(new WebChromeClient()); webView.setWebViewClient(new CustomWebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if (!isDummy) webViewContainer.setTag(System.currentTimeMillis()); } }); //disabling long touch - text not selectable webView.setOnLongClickListener(v -> true); webView.setLongClickable(false); webView.setHapticFeedbackEnabled(false); 已被调用webView,并且始终处于工作状态,而与定位无关...

问题很简单:这种行为的原因是什么以及如何解决?

我一直在查看DOCs在目标更新后可能会改变我的应用行为的原因,但是没有关于setLayerType(WebView.LAYER_TYPE_SOFTWARE)的消息。另外,我还发现了一些有关WebView-so-called Trichrome渲染变化的隐藏信息,但仍然不知道是否相关-我没有任何特殊的日志/输出,没有任何线索和信息。从5.0到10,我正在使用WebView

2 个答案:

答案 0 :(得分:3)

事实证明,加载内容的方式非常重要... loadUrl中有loadDataloadDataWithBaseURLWebView个方法,并且这三个都在处理给定的输入数据以完全不同的方式

在我看来有问题的是loadData,其代码类似于以下内容:

<body style="margin: 0; padding: 0"><div class='banner-wrap'>        
<iframe class='html5-iframe' src='https://example.com/html5/123.html#https://example-ads.com/deliver/ad.php?param=123__destination=https%3A%2F%2Fwww.anothersite.com%2F' width='300' height='300'>
</iframe>    
<a href='https://example.com/html5/123.html#https://example-ads.com/deliver/ad.php?param=123__destination=https%3A%2F%2Fwww.anothersite.com%2F' target='_blank'>
</a>    
</div></body>

请注意,该网址是html转义(存在%),但有一个例外:网址中的。网址中存在此字符的iframe将不会加载内容...,并且在定位<= 28时正在加载。在使用loadUrl时使用-#-url时,无论目标如何,一切都正常。但我适合已经存在的广告发布系统,并且不会为应用程序更改。我还认为,处理给定的HTML代码以提取src网址不是一种正确的方法(系统可能有一天会升级)...

我目前的解决方案是使用base64并为WebView设置相同的编码:

String base64version = Base64.encodeToString(htmlData.getBytes(), Base64.DEFAULT);
webView.loadData(base64version, "text/html; charset=UTF-8", "base64");

答案 1 :(得分:0)

<块引用>

我在更新版本 SDK 29 时遇到了同样的问题。我更改了适用于 SDK 版本 29 的代码

    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    WebViewClientImpl webViewClient = new WebViewClientImpl(this);
    webView.setWebViewClient(webViewClient);
    webView.setWebChromeClient(new WebChromeClient());
    webView.loadDataWithBaseURL(null,html_content,"text/html","UTF-8",null);