3

我试图从 http 响应中获取图像,但无法将流转换为位图。请让我知道,我在这里缺少什么。

仅供参考 - 图像内容作为原始二进制及其 jpeg 图像接收。

遵循的程序:

  1. 制作 HttpRequest。
  2. 作为响应检查 200 -> 获取 httpentity 内容。
  3. 使用 BitMap 工厂将流转换为位图。
  4. 将位图设置为 imageview

在 AsyncTask 的 postExecute 中执行此操作

    HttpClient httpclient = new DefaultHttpClient();
    HttpGet httpget = new HttpGet(endpoint);
    // Adding Headers .. 
    // Execute the request
    HttpResponse response;
    try {
        response = httpclient.execute(httpget);
    if (response.getStatusLine().getStatusCode() == 200) {
        // Get hold of the response entity
        HttpEntity entity = response.getEntity();
        if (entity != null) {
        InputStream instream = entity.getContent();
        return instream;
        // instream.close();
            }
    }
}

在 AsyncTask 的 postExecute 中执行此操作

    if (null != instream) {
        Bitmap bm = BitmapFactory.decodeStream(instream);
        if(null == bm){
    Toast toast = Toast.makeText(getApplicationContext(),
        "Bitmap is NULL", Toast.LENGTH_SHORT);
            toast.show();
    }
        ImageView view = (ImageView) findViewById(R.id.picture_frame);
    view.setImageBitmap(bm);
    }

提前致谢。

4

2 回答 2

5

终于找到了这个问题的答案。下面是片段 - 可能对使用 http 响应的新手有所帮助。

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(endpoint);
// Adding Headers .. 
// Execute the request
HttpResponse response;
try {
    response = httpclient.execute(httpget);
if (response.getStatusLine().getStatusCode() == 200) {
    // Get hold of the response entity
    HttpEntity entity = response.getEntity();
    if (entity != null) {
    InputStream instream = entity.getContent();
    String path = "/storage/emulated/0/YOURAPPFOLDER/FILENAME.EXTENSION";
    FileOutputStream output = new FileOutputStream(path);
    int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];
    int len = 0;
    while ((len = instream.read(buffer)) != -1) {
        output.write(buffer, 0, len);
    }
    output.close();
}

我们可以将内容保存在字节数组中并从中获取位图,而不是将文件保存到磁盘。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int len = 0;
try {
    // instream is content got from httpentity.getContent()
    while ((len = instream.read(buffer)) != -1) {
    baos.write(buffer, 0, len);
    }
    baos.close();
} catch (IOException e) {
    e.printStackTrace();
}
byte[] b = baos.toByteArray();
Bitmap bmp = BitmapFactory.decodeByteArray(b, 0, b.length);
ImageView imageView = (ImageView)findViewById(R.id.picture_frame);
imageView.setImageBitmap(bmp);

仅供参考 - 在 android 文件输出流中写入本地磁盘必须在非 UI 线程中完成(在我的情况下使用了异步任务并且此处未添加该部分)。

谢谢 ..

于 2014-02-24T09:54:29.013 回答
1

使用此库处理来自网络的图像。https://github.com/nostra13/Android-Universal-Image-Loader 它为您完成一切。但是您应该将 onPostExecute 中的代码放到 onDoInBackground 中。onPre 和 onPost 执行代码将在主线程上执行,doInBackground 是工作线程。但在这种情况下只需使用通用图像加载器

于 2014-02-20T21:29:52.887 回答