Domanda

Am trying to get a image from a http response, but am failing to convert the stream to bitmap. Please let me know, what am i missing here.

FYI - the image content is received as raw binary & its a jpeg image.

Procedure followed:

  1. Make HttpRequest.
  2. In response check for 200 -> get the httpentity content.
  3. convert the stream to bitmap using BitMap factory.
  4. Set the bitmap to imageview

Doing this in postExecute of the AsyncTask

    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();
            }
    }
}

Doing this in postExecute of the AsyncTask

    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);
    }

Thanks in Advance.

È stato utile?

Soluzione

Finally found the answer for this. below is the snippet - might help for the newbees working with http responses.

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();
}

Instead of saving the file to disk, we can have the contents in the bytearray and get the bitmap from that.

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);

FYI - In android fileoutput stream writing to local disk have to be done in non UI thread(have used async task in my case & that part is not added here).

Thanks ..

Altri suggerimenti

Use this library to work with images from web. https://github.com/nostra13/Android-Universal-Image-Loader It does everything for you. But the code from onPostExecute you should put to onDoInBackground. onPre and onPost execute codes will be executed on main thread, doInBackground is the worker thread. But just use universal image loader in this case

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top