为啥 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 应用程序的端口,它允许我的客户将文件转储到资产目录中,更改一些设置,然后重新编译以创建一个“全新的应用程序”。我无法预测文件名将包含哪些字符,这特别来自他提供给我的测试集。相信我,如果我可以重命名文件,我会的。
哦,另外,我注意到<img>
中的坏名并更正了它......仍然没有用。该图像在其他任何地方都可以正常打开(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
如何在 WebView Android Studio 中打开本地 pdf 文件