Skip to content

Instantly share code, notes, and snippets.

@Antarix
Created November 29, 2012 08:48
Show Gist options
  • Save Antarix/4167655 to your computer and use it in GitHub Desktop.
Save Antarix/4167655 to your computer and use it in GitHub Desktop.
UrlImage Parser for android TextView to load Html Image tag
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.text.Html.ImageGetter;
import android.view.View;
public class UrlImageParser implements ImageGetter {
Context c;
View container;
/***
* Construct the URLImageParser which will execute AsyncTask and refresh the container
* @param t
* @param c
*/
public UrlImageParser(View t, Context c) {
this.c = c;
this.container = t;
}
public Drawable getDrawable(String source) {
UrlDrawable urlDrawable = new UrlDrawable();
// get the actual source
ImageGetterAsyncTask asyncTask =
new ImageGetterAsyncTask( urlDrawable);
asyncTask.execute(source);
// return reference to URLDrawable where I will change with actual image from
// the src tag
return urlDrawable;
}
public class ImageGetterAsyncTask extends AsyncTask<String, Void, Drawable> {
UrlDrawable urlDrawable;
public ImageGetterAsyncTask(UrlDrawable d) {
this.urlDrawable = d;
}
@Override
protected Drawable doInBackground(String... params) {
String source = params[0];
return fetchDrawable(source);
}
@Override
protected void onPostExecute(Drawable result) {
// set the correct bound according to the result from HTTP call
urlDrawable.setBounds(0, 0, 0 + result.getIntrinsicWidth(), 0
+ result.getIntrinsicHeight());
// change the reference of the current drawable to the result
// from the HTTP call
urlDrawable.drawable = result;
// redraw the image by invalidating the container
UrlImageParser.this.container.invalidate();
}
/***
* Get the Drawable from URL
* @param urlString
* @return
*/
public Drawable fetchDrawable(String urlString) {
try {
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
drawable.setBounds(0, 0, 0 + drawable.getIntrinsicWidth(), 0
+ drawable.getIntrinsicHeight());
return drawable;
} catch (Exception e) {
return null;
}
}
private InputStream fetch(String urlString) throws MalformedURLException, IOException {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(urlString);
HttpResponse response = httpClient.execute(request);
return response.getEntity().getContent();
}
}
@SuppressWarnings("deprecation")
public class UrlDrawable extends BitmapDrawable {
// the drawable that you need to set, you could set the initial drawing
// with the loading image if you need to
protected Drawable drawable;
@Override
public void draw(Canvas canvas) {
// override the draw to facilitate refresh function later
if(drawable != null) {
drawable.draw(canvas);
}
}
}
}
@dschuermann
Copy link

Are you okay with publishing this under the Apache License v2?

@Tunarock
Copy link

very useful, thanks a lot!!! I'm having a little problem with the image, all the images are cut in height... it shows only the upper part, maybe it's problem of layout??

@sudhanshusri16
Copy link

Text and Image are overlapping to each other.. what can be the problem behind that.

@jurosh
Copy link

jurosh commented Jun 14, 2014

Fails on line 61: urlDrawable.setBounds(0, 0, 0 + result.getIntrinsicWidth(), 0 + result.getIntrinsicHeight());

  • result is NULL..
    I am quite novice in android and not sure how to fix it, when I catch error app works, just no images inside.

@UmaYalanati
Copy link

Text and Image are overlapping to each other.. Can u Please provide solution....

@ItsCalebJones
Copy link

Hold on to a reference from the textview and try this at the end of the postExecute:

        URLImageParser.this.container.invalidate(); //redraw the image by invalidating the container
        container.setText(container.getText());

@kamaroly
Copy link

Can anyone post a usage example ?
Thanks

@bennsimon
Copy link

I have a question....can the string which has the URL be retrieved from the web E.g something like MySQL db or be dynamic

@9538263753
Copy link

Is it possible to get the images from server side instead of placing in drawable folder

@kritika-thakur
Copy link

Not working for me! Text and image is overlapping.

@luisfredgs
Copy link

DefaultHttpClient is deprecated. Try HttpURLConnection on fetch method:

private InputStream fetch(String urlString) throws MalformedURLException, IOException {

    URL url = new URL(urlString);
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
    InputStream stream = urlConnection.getInputStream();

    return stream;

}

@parthvora25
Copy link

@UmaYalanati and @caman9119

I have the same issue for setting the image below the text and i tried to apply ur given solution that is

URLImageParser.this.container.invalidate(); //redraw the image by invalidating the container
container.setText(container.getText());

but the last line of setting text gives error as this method is not present for that container. Looking for reply ASAP....

@mhasby
Copy link

mhasby commented Jun 2, 2016

@parthvora25

if(container instanceof TextView) { ((TextView)container).setText(((TextView)container).getText()); }

thx @Antarix! I've tried it. it works.

@atul7398
Copy link

Well i get Html data from server but my image in base64 encoded in "" tag and text inside

tag......... how to show these data in exact format inside android view ?????

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment