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

4
我有一个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建议),那么它会加载图像,但它会尝试将其解析为文本,而不是图像,所以我只会得到许多(基本上是)垃圾。

由imgur.com托管

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

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

9

好的,经过长时间的研究,我已经弄清楚了问题所在。基本上,如果存储在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版本上,我已经提交了一个错误报告


3
尝试将文件名中的%删除,或将其转义为%25

您的更新中的<img>标签没有正确编码的相对URL,因为您没有将%符号转义为%25。至于为什么URLEncoder.encode()没有这样做,我不知道,但据我所知,您不能在URL中使用裸露的%。此外,由于这是一个嵌入在您的APK中的资产,为什么首先要费心处理麻烦的文件名呢?只需将文件重命名为简单的名称即可。如果*失败,请确认您有有效的JPEG图像。 - CommonsWare
哦,另外,我注意到<img>中的错误名称并进行了更正...但仍然无法工作。该图像在其他所有地方都可以正常打开(Firefox,GNOME的Eye,GIMP),但为了保险起见,我在GIMP中打开它,稍微修改了一下,然后重新保存。仍然没有成功。 - Jeremy Logan
为了好玩,我试图从文件名中删除“%”,但没有任何影响...仍然无法将其加载为图像。 - Jeremy Logan
你的资源文件夹中,其他JPEG文件可以正常工作吗?是只有这个文件无法使用吗?还是所有JPEG文件都无法使用? - CommonsWare
我刚刚尝试了JPEG、PNG和GIF格式的图片,它们都得到了相同的结果。 - Jeremy Logan
显示剩余3条评论

0
我猜WebView只能理解与文本相关的内容类型,所以它会忠实地将你的JPG视为base64编码,解码并将结果呈现为乱码文本。我不确定是否可以为WebView设置内容类型,但作为解决方法,您可以尝试在html标记中嵌入img标记并加载结果页面。此外,您可能只能使用WebView#loadDataWithBaseUrl。

结果发现它在处理图像方面还是可以的...有点。如果您感兴趣,请查看我的答案。 - Jeremy Logan

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