Create a gist now

Instantly share code, notes, and snippets.

Embed
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

This comment has been minimized.

Show comment
Hide comment
@dschuermann

dschuermann Sep 2, 2013

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

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

@Tunarock

This comment has been minimized.

Show comment
Hide comment
@Tunarock

Tunarock Feb 18, 2014

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??

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

This comment has been minimized.

Show comment
Hide comment
@sudhanshusri16

sudhanshusri16 Feb 27, 2014

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

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

@jurosh

This comment has been minimized.

Show comment
Hide comment
@jurosh

jurosh 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.

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

This comment has been minimized.

Show comment
Hide comment
@UmaYalanati

UmaYalanati Jun 30, 2015

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

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

@ItsCalebJones

This comment has been minimized.

Show comment
Hide comment
@ItsCalebJones

ItsCalebJones Nov 19, 2015

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

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

This comment has been minimized.

Show comment
Hide comment
@kamaroly

kamaroly Dec 29, 2015

Can anyone post a usage example ?
Thanks

Can anyone post a usage example ?
Thanks

@Magus14

This comment has been minimized.

Show comment
Hide comment
@Magus14

Magus14 Feb 9, 2016

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

Magus14 commented Feb 9, 2016

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

This comment has been minimized.

Show comment
Hide comment
@9538263753

9538263753 Feb 25, 2016

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

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

@kritika-thakur

This comment has been minimized.

Show comment
Hide comment
@kritika-thakur

kritika-thakur Mar 8, 2016

Not working for me! Text and image is overlapping.

Not working for me! Text and image is overlapping.

@luisfredgs

This comment has been minimized.

Show comment
Hide comment
@luisfredgs

luisfredgs May 5, 2016

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;

}

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

This comment has been minimized.

Show comment
Hide comment
@parthvora25

parthvora25 May 30, 2016

@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....

@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

This comment has been minimized.

Show comment
Hide comment
@mhasby

mhasby Jun 2, 2016

@parthvora25

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

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

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

This comment has been minimized.

Show comment
Hide comment
@atul7398

atul7398 Jul 29, 2016

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 ?????

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