-
-
Save Antarix/4167655 to your computer and use it in GitHub Desktop.
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); | |
} | |
} | |
} | |
} |
Not working for me! Text and image is overlapping.
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;
}
@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....
if(container instanceof TextView) { ((TextView)container).setText(((TextView)container).getText()); }
thx @Antarix! I've tried it. it works.
You can find an improved version here: https://github.com/SufficientlySecure/html-textview/blob/master/HtmlTextView/src/main/java/org/sufficientlysecure/htmltextview/HtmlRemoteImageGetter.java
Is it possible to get the images from server side instead of placing in drawable folder