Android:bitmapfactory.decodestream 返回 null
Posted
技术标签:
【中文标题】Android:bitmapfactory.decodestream 返回 null【英文标题】:Android: bitmapfactory.decodestream returns null 【发布时间】:2012-05-18 10:09:11 【问题描述】:我试图从图像的路径中获取位图图像。但BitmapFactory.decodeStream
返回null
值。
代码:
URL url = new URL(path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
connection.disconnect();
input.close();
我搜索了更多的网站,仍然没有得到解决方案。
【问题讨论】:
你确定 url 指向 BitmapFacotry 可以解码的东西吗? 是的,网址:static.adzerk.net/Advertisers/… BitmapFactory.decodeStream() 存在错误。例如,尝试将图像保存在 sd 上,而不是 decodeStream,然后通过 BitmpaFoctory 加载它或阅读以下内容:android-developers.blogspot.it/2010/07/… 【参考方案1】:找到解决方案:
HttpGet httpRequest = new HttpGet(URI.create(path) );
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
HttpEntity entity = response.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
bmp = BitmapFactory.decodeStream(bufHttpEntity.getContent());
httpRequest.abort();
问题在于,一旦您使用了来自HttpUrlConnection
的InputStream
,您就无法倒带并再次使用相同的InputStream
。因此,您必须为图像的实际采样创建一个新的InputStream
。否则我们必须中止HTTP
请求。
【讨论】:
这个解决方案对所描述的问题有什么不同?在这两个中,我看到你只使用一次流 @Guy:只有在我们可以使用 inputstream 进行 httprequest 时,如果您尝试下载另一个图像,则会像这样抛出“InputStream 已创建”错误。所以我们需要在使用 httpRequest.abort(); 下载后中止 httprequest; 谢谢。感谢您的回答。 此解决方案今天已弃用:2016 年 2 月 22 日【参考方案2】:public Bitmap getBitmapFromUrl(String url)
Bitmap bm = null;
InputStream is = null;
BufferedInputStream bis = null;
try
URLConnection conn = new URL(url).openConnection();
conn.connect();
is = conn.getInputStream();
bis = new BufferedInputStream(is, 8192);
bm = BitmapFactory.decodeStream(bis);
catch (Exception e)
e.printStackTrace();
finally
if (bis != null)
try
bis.close();
catch (IOException e)
e.printStackTrace();
if (is != null)
try
is.close();
catch (IOException e)
e.printStackTrace();
return bm;
不要忘记在线程(不是主线程)中调用它
【讨论】:
【参考方案3】:我有同样的问题,但在我的情况下,问题是资源(图像)。确保图像不是 CMYK 颜色模式,因为 Android 不支持 CMYK 图像。详情请见this question
祝你好运;)
【讨论】:
【参考方案4】:使用以下代码可以从 url 下载图像
String IMAGE_URL = "http://www.kolkatabirds.com/rainquail8vt.jpg";
//where we want to download it from
URL url;
try
url = new URL(IMAGE_URL);
//open the connection
URLConnection ucon = url.openConnection();
//buffer the download
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is,1024);
//get the bytes one by one
int current = 0;
while ((current = bis.read()) != -1)
baf.append((byte) current);
//convert it back to an image
ByteArrayInputStream imageStream = new ByteArrayInputStream(baf.toByteArray());
Bitmap theImage = BitmapFactory.decodeStream(imageStream);
img.setImageBitmap(theImage);
【讨论】:
ByteArrayBuffer baf = new ByteArrayBuffer(1024); ByteArrayBuffer 类是什么?【参考方案5】:在解码流之前需要BufferedInputStream....
试试这个,它非常适合我使用;
BufferedInputStream buf = new BufferedInputStream(inputsteam, 1024);
将 buf 传递给解码流,它将完美地工作。
Bitmap theImage = BitmapFactory.decodeStream(buf);
最后设置你的位图。
【讨论】:
以上是关于Android:bitmapfactory.decodestream 返回 null的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )