为啥 WebView 无法打开某些本地 URL(Android)?

Posted

技术标签:

【中文标题】为啥 WebView 无法打开某些本地 URL(Android)?【英文标题】:Why is WebView unable to open some local URLs (Android)?为什么 WebView 无法打开某些本地 URL(Android)? 【发布时间】:2010-12-14 20:40:55 【问题描述】:

我有一个WebView,我用它来打开存储在我项目的assets/ 目录中的一些文件。它适用于大多数文件,但特别是有一个(我敢肯定我还没有找到其他文件)它只是不会打开。

我遇到问题的文件名为:

"assets/ContentRoot/Photos/XXX Software Logo - jpg - 75%.JPG"

当我将它传递给WebView,它显示错误页面时,它显示为:

"file:///android_asset/ContentRoot/Photos/XXX%20Software%20Logo%20-%20jpg%20-%2075%.JPG"

然后我尝试在其上运行 URLEncoder.encode() 并得到错误页面,其 URL 显示为:

"file:///android_asset/ContentRoot/Photos/XXX+Software+Logo+-+jpg+-+75%.JPG"

这两个 URL 都无法打开文件(我觉得它们看起来都不错)。有人有什么想法吗?

更新:如果我手动编码%(使用%25,正如commonsware.com 建议的那样)然后它会加载图像,但它会尝试将其解析为文本,而不是一张图片,所以我得到了很多(基本上)垃圾。

另外,使用相对 URL 引用 html 文档中的图像也不起作用(可能是因为它没有被解析为图像?):

<img src="../Photos/XXX%20Software%20Logo%20-%20jpg%20-%2075%.JPG" />
<img src="../Photos/XXX%20Software%20Logo%20-%20jpg%20-%2075%25.JPG" />

【问题讨论】:

【参考方案1】:

好的,在这方面花了太长时间之后,我已经弄清楚发生了什么。基本上,如果存储在assets/ 目录中的图像在其文件名中包含空格(例如,“”),它们将不会呈现为图像。

myWebView.loadUrl("file:///android_asset/testimage.jpg");

工作正常。然而,

myWebView.loadUrl("file:///android_asset/test+image.jpg");

只是抛出一个未找到的错误,然后

myWebView.loadUrl("file:///android_asset/test image.jpg");
// and
myWebView.loadUrl("file:///android_asset/test%20image.jpg");

显示它显示不正确(作为文本...参见有问题的屏幕截图)。

这种意外行为出现在(至少)1.5、1.6 和 2.0 以及我 filed a bug report。

【讨论】:

【参考方案2】:

尝试去掉文件名中的%。或者,将其转义为 %25

【讨论】:

当然可以,但URLEncoder.encode() 不应该处理这个问题吗?这不就是存在的全部理由吗?无论如何,我试过了,它现在尝试打开它,但它只是将其作为文本转储而不是渲染图像。 您更新中的 标记没有正确编码的相对 URL,因为您没有将 % 符号转义为 %25。至于为什么 URLEncoder.encode() 不这样做,我不知道,但是 AFAIK 你不能在 URL 中有一个裸露的 % 。此外,既然这是在您的 APK 中烘焙的资产,那么您为什么首先要对麻烦的文件名大惊小怪呢?只需将文件重命名为简单的名称。如果 that 失败,请确认您拥有有效的 JPEG 图像。 基本上我正在构建一个 iPhone 应用程序的端口,它允许我的客户将文件转储到资产目录中,更改一些设置,然后重新编译以创建一个“全新的应用程序”。我无法预测文件名将包含哪些字符,这特别来自他提供给我的测试集。相信我,如果我可以重命名文件,我会的。 哦,另外,我注意到&lt;img&gt; 中的坏名并更正了它......仍然没有用。该图像在其他任何地方都可以正常打开(Firefox、GNOME 之眼、GIMP),但为了更好地衡量,我在 GIMP 中打开它,稍作更改,然后重新保存。还是没有运气。 只是为了好玩,我继续从文件名中删除了%,它没有任何区别......仍然不会作为图像加载。【参考方案3】:

我猜 WebView 只理解与文本相关的内容类型,因此它忠实地将您的 JPG 视为 base64 编码、解码和显示结果 gobble-goop 作为文本。我真的不知道是否可以为 WebView 设置内容类型,但作为解决方法,您可以尝试将 img 标签放入 html 标签并加载结果页面。另外你可能只能使用 WebView#loadDataWithBaseUrl

【讨论】:

事实证明它适用于图像......有点。如果你在乎,请看我的回答。

以上是关于为啥 WebView 无法打开某些本地 URL(Android)?的主要内容,如果未能解决你的问题,请参考以下文章

Mac OS/WebView:为啥加载本地页面时无法使用 Flash 和其他插件?

Android分享笔记 Android的webview加载本地html本apk内html和远程URL

如何在iOS中的WebView中打开URL?

如何在 WebView Android Studio 中打开本地 pdf 文件

WPF(或WinForm)WebView不会打开本地URL(NotFound 404错误)

为啥我不能使用 Webview 加载我的本地页面