【问题标题】: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" />

【问题讨论】:

    标签: android url webview


    【解决方案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

      【讨论】:

      • 事实证明它适用于图像......有点。如果你在乎,请看我的回答。
      猜你喜欢
      • 2021-07-12
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 2016-06-03
      相关资源
      最近更新 更多