从本地私有目录在webview中加载图片

7
上下文:
我的应用程序有时会显示“Sheets”,这些是包含文本和图像的html文件:
<p>image description </p>
<p><img src="/api/medias/get/videos/56afad6447eba61c8099544b?thumbnail=true&amp;company=4f86d0a9d655ab9794f5d1d2&amp;fullSizedCover=true" 
    alt="" 
    data-id="56afad6447eba61c8099544b" 
    data-type="video" data-width="640" data-height="1136" /></p>

然后我使用 body.loadDataWithBaseURL(<我的api url>, body, "text/html; charset=UTF-8", null, null);。我认为这并不相关,但我还是说一下,我有一个包含css和javascript的模板body。js脚本检测图像点击并通过JavascriptInterface将"data-id"传输给android方法。在这种情况下,它会打开视频播放器并播放视频。
问题:
我的应用程序允许用户下载这些表格以便稍后离线查看。因此,我下载了html,然后下载了图像到我的本地私有目录(Context.getFileDir()),并更改了html的src,以将“缩略图”源设置为我下载的图像。
<p>video</p>
<p><img src="69c623955ecb5bd414f908cd383f3809.jpg" 
    alt="" 
    data-id="56afad6447eba61c8099544b" 
    data-type="video" data-width="640" data-height="360" /></p>

我的问题是:我应该将什么作为我的 WebView 的基本 URL,以便我获得预期的行为(即显示已下载的图像)。
我尝试过 "Context.getFileDir().getAbsolutePath()"、"content://com.android.htmlfileprovider" 等。
我应该做些什么不同的吗?
非常感谢,
这个很好用: Picasso.with(iv.getContext()).load(new File(getContext().getFilesDir() + "/" + "69c623955ecb5bd414f908cd383f3809.jpg")).into(iv); html:
<p>video</p>
<p><img src="69c623955ecb5bd414f908cd383f3809.jpg" alt="" data-id="56afad6447eba61c8099544b" data-type="video" data-width="640" data-height="360" /></p>

我的基础URL:baseUrl = Uri.fromFile(getContext().getFilesDir()).toString();

最后: webview.loadDataWithBaseURL(baseUrl, body, "text/html; charset=UTF-8", null, null);

我尝试过 Context.getFileDir().getAbsolutePath()——用 'file' 方案尝试一下。更简单的方法是使用 Uri.fromFile(getFilesDir()).toString()。 - CommonsWare
我的图片仍然无法使用这个baseUrl显示: file:///data/user/0/<my package>/files,而new File(Context.getFilesDir()+"/"+"69c623955ecb5bd414f908cd383f3809.jpg").exists()==true - Renaud Favier
@CommonsWare 这些代码有用吗?(之前没有,刚添加了但好像没有改变任何东西):
  • body.getSettings().setAllowFileAccess(true);
  • body.getSettings().setAllowContentAccess(true);
  • body.getSettings().setAllowFileAccessFromFileURLs(true);
  • body.getSettings().setAllowUniversalAccessFromFileURLs(true);
- Renaud Favier
我认为这些是用于URL和内容本身的。自从我尝试从本地文件加载内容以来已经很久了,所以我忘记了细节,抱歉。 - CommonsWare
@CommonsWare 好的,无论如何还是谢谢您! - Renaud Favier
1个回答

2

如果您已经下载/拥有模板,则可以尝试使用空的baseUrl,并将HTML模板作为主体传递给webview。在传递之前,在其中查找img标记,并使用本地存储文件的完整路径设置img src。类似于:

Document doc = Jsoup.parse(newHtml);
Elements elems = doc.getElementsByTag("img");
for (Element el : elems) {
    String filename = el.attr("src"); //presumably only name
    String picUri = "file:///" + folder + "/"+filename;
    el.attr("src", picUri);   
}
web.loadDataWithBaseURL(null, htmlBody, "text/html", "UTF-8", null);

我不知道为什么,但实际上,在基本URL中放置“base”并传递null并手动将其放置在src标记内是有效的。 - Renaud Favier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接