我 100% 确定这里的问题出在实际图像上。但是我希望解决方案是图像的某些属性,它将在未来帮助其他人。
图片:
有问题的照片 http://soundwave.robotsidekick.com/mlsphotos.jpg
我尝试以多种方式加载此图像。我已经下载并尝试将其加载到ImageView
:
final ImageView v = (ImageView) findViewById(R.id.image);
v.setImageResource(R.drawable.photo);
v.invalidate();
我试过从一个网址加载它:
final String[] params = new String[] {
"",
};
(new AsyncTask<String, Bitmap, Bitmap>()
{
@Override
protected Bitmap doInBackground(final String... params)
{
Bitmap ret = null;
for (final String url : params)
{
try
{
Log.e(TAG, url);
ret = BitmapFactory.decodeStream((new URL(url)).openStream());
publishProgress(ret);
}
catch (final MalformedURLException e)
{
Log.e(TAG, "Malformed URL", e);
}
catch (final IOException e)
{
Log.e(TAG, "IO Exception", e);
}
}
return ret;
}
@Override
protected void onProgressUpdate(final Bitmap... values)
{
super.onProgressUpdate(values);
for (final Bitmap result : values)
{
if (result != null)
{
final ImageView v = (ImageView) MainActivity.this.findViewById(R.id.image);
v.setImageBitmap(result);
v.invalidate();
}
}
}
}).execute(params);
我也尝试过WebView
像这样加载图像:
final WebView webview = (WebView) findViewById(R.id.webview);
webview.loadData("<html><body><img src=\"" + url + "\"></body></html>", "text/html", "utf-8");
webview.invalidate();
我也尝试在浏览器(应用程序)中加载图像,但这不起作用。
这些都不起作用,但是如果我将 url 加载到 Android 上的 Chrome 中,它会很好用(不是在浏览器中),如果我在桌面浏览器(Chrome、Firefox 等)上加载图像,它会很好地加载。我已经检查了 mime 类型是否与扩展名匹配,但我很茫然。
编辑
对于来自InputStream
位图处理在流完成之前用完流上的数据的图像,有一种解决方法。解决方法记录在这个问题和这个错误中。
然而,这是一个损坏的图像,其数据过早结束。我知道这意味着我已经走下坡路了,但我希望能有更好的错误处理,而不是 Android 把我传回去null
,我输了。iOS、Chrome(在设备和计算机上)以及大多数其他地方似乎有更好的错误处理。我可以在 Android 上做些什么来处理损坏的 jpg 文件吗?
编辑 2
这里必须有一个解决方案,因为我设备上的 Chrome 可以优雅地处理这种情况。然而,我能解决这个问题的最接近的是以下代码:
final InputStream is = (new URL(url)).openStream();
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
final int size = 1024;
int len = -1;
byte[] buf = new byte[size];
while ((len = is.read(buf, 0, size)) != -1)
{
bos.write(buf, 0, len);
}
buf = bos.toByteArray();
// buf is now filled with the corrupted bytes of the image
ret = BitmapFactory.decodeByteArray(buf, 0, buf.length);
// ret is null because it was a corrupt jpg
使用该代码,我可以检查是否有字节并且图像没有被解码。然后至少我可以告诉我有一个损坏的图像(或不是图像),并且可以向用户报告一些对用户更有用的东西(嘿,我这里有一个 16K 的图像,但我肯定不知道如何处理它) .
任何人都知道 Chrome 如何在损坏之前设法解码尽可能多的图像?