Android:如何在 WebView 中加载 html 字符串?

Posted

技术标签:

【中文标题】Android:如何在 WebView 中加载 html 字符串?【英文标题】:Android: how to load html string inside a WebView? 【发布时间】:2019-08-13 14:45:25 【问题描述】:

我在 android 应用程序的布局文件中有一个 webview,我想在其中加载一个包含 htmljavascript 的视频。我想用来加载视频的 html 字符串是:

video= '<div id="15518031408206776"><script type="text/JavaScript" src="https://www.aparat.com/embed/gJ8jm?data[rnddiv]=15518031408206776&data[responsive]=yes"></script></div>'

WebView xml 代码为:

<WebView
                        android:layout_
                        android:layout_
                        android:layout_marginTop="30dp"
                        tools:ignore="WebViewLayout"
                        android:id="@+id/post_video" />

我还在 webview 中启用了 javascriop:

post_video.getSettings().setJavaScriptEnabled(true)

post_video.loadDataWithBaseURL( null, video, "text/html", "UTF-8", null );

但 webview 只显示纯文本 html 代码而不是视频!

you can see the result in this screenshot

我该如何解决这个问题?

更新:

我通过使用 Html.fromHtml(video) 来解码我的 html 字符串解决了这个问题!现在它正在工作,WebView 显示视频。

【问题讨论】:

【参考方案1】:

尝试将以下属性添加到 webview

    WebView webview = (WebView) findViewById(R.id.webView1);
    webview.setWebViewClient(new WebViewClient());
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webview.getSettings().setPluginState(WebSettings.PluginState.ON);
    webview.getSettings().setMediaPlaybackRequiresUserGesture(false);
    webview.setWebChromeClient(new WebChromeClient());
    webview.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null);

还要在清单文件中将android:hardwareAccelerated="true" 添加到application 标记

【讨论】:

感谢您的方法,但根据 Android 文档:“如果您的目标 API 级别 >=14...,则默认启用硬件加速...”并将 android:hardwareAccelerated="true" 添加到应用程序清单文件中的标记没有解决我的问题! 我通过使用 Html.fromHtml(video) 来解码我的 html 字符串解决了这个问题!现在它正在工作,WebView 显示视频。【参考方案2】:

简单。 制作一个这样的适配器方法。

  @JvmStatic
@BindingAdapter("htmlString")
fun loadHTML(view: WebView, htmlString: String) 
    if(htmlString.isEmpty())
        return
    

    try
        view.webChromeClient = WebChromeClient()
        view.webViewClient = object : WebViewClient() 
            override fun onPageFinished(view: WebView, url: String) 
                super.onPageFinished(view, url)
            
            override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean 
                return false
            
        

        view.loadData(htmlString, "text/html", "UTF-8")
    catch (ex: Exception)
        A35Log.e(TAG, "Error loading html string")
    

然后像这样在你的 xml 代码中使用它。

 <WebView
    android:id="@+id/wvHtml"
    android:layout_
    android:layout_
    bind:htmlString="@viewModel.infoModel.hTML"
    />

如果您不使用数据绑定并且只想使用代码,那么只需从适配器示例中获取代码并将其直接加载到 webview 中。但是,数据绑定和适配器是保持代码简洁和简洁的好方法。

最后,在 pie 中,默认情况下它停止允许 http 流量(清除流量)加载。因此,如果由于任何原因无法加载,您可能必须添加到您的应用程序标签以允许加载不安全的 html。我不确定加载您自己的 HTML 字符串是否算作“不安全”,但它可能会。

 <application
    ...
   android:usesCleartextTraffic="true">

</application>

【讨论】:

【参考方案3】:

尝试使用 loadData (String data, String mimeType, String encoding) method 代替,使用“text/html”mime 类型和“UTF-8”编码。

此外,您应该使用&lt;html&gt;&lt;body&gt; 标记来包装您的html 内容,这样您将拥有一个有效的html 文档,而不仅仅是一个有效的文档片段。

【讨论】:

我通过使用 Html.fromHtml(video) 来解码我的 html 字符串解决了这个问题!现在它正在工作,WebView 显示视频。并且不需要使用完整的 html 标签。

以上是关于Android:如何在 WebView 中加载 html 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android WebView 中加载本地图像

如何在android中的对话框中加载webview

如何在android 7中加载html之前在webview中注入javascript脚本

取消在 Android 上的 WebView 中加载

如何在 Android Webview 中加载网页之前注入 javascript?

在 WebView 中加载页面之前,用本地 Android 资源替换 HTML 文档的图像