Laden Sie Bilder in Html.fromHtml in Textansicht (http url Bilder, Base64 Url Bilder)

Ich habe eine Textansicht, in der ich den Inhalt eines Forenbeitrags zeige, der auf der Website mit rte eingegeben wird, der Inhalt beinhaltet Bilder, sowohl die Art Web-URL als auch den Typ Base64 .. Die Standardimplementierung von Html.fromHtml ersetzt alle img Tags mit kleinem Quadrat ..

Ich schaute auf SO für die Lösung, um Bilder von url mit Html.fromHtml-Methode zu laden, stellt sich heraus, es gibt Weg, es zu tun, können wir einen ImageGetter an die Funktion übergeben .. Ich fand diese großartige Antwort, die die URL holt Teil, aber das Schlägt und stürzt die App ab, wenn der Inhalt ein Bild von Base64 .

  • Android: Ändern Sie die absolute Position einer Ansicht programmgesteuert
  • Wie benutzt man Smack 4.2 für den Anschluss an ejabberd?
  • Ist es möglich, eine erweiterbare Liste zu erstellen AlertDialog?
  • Rendering Problem für Android mit Intellij 13.1.3
  • Hinzufügen von Tabellenzeilen dynamisch in Android
  • Kann nicht erstellt werden: Die Datei dx.jar wurde nicht aus dem SDK-Ordner in meiner Eclipse geladen
  • Ich habe eine Möglichkeit, Bilder für Base64 src zu erstellen, aber keine der Lösungen funktionieren, wenn jemand die ganze Lösung implementiert hat, ist großartig. Wenn jemand hat nur die Base64 Teil bitte vor, dass ich integrieren beide ..

  • Android: 4.0.3 Emulator schloss nach einiger Zeit automatisch
  • Wie kann man mehrere Elemente in einer Listenansicht hervorheben?
  • BLE Android - onConnectionStateChange wird nicht aufgerufen
  • Was ist WindowManager in Android?
  • Netzwerkart erhalten
  • RecyclerView Animation auf Artikel klicken
  • 2 Solutions collect form web for “Laden Sie Bilder in Html.fromHtml in Textansicht (http url Bilder, Base64 Url Bilder)”

    Schließlich, nachdem ich stundenlang darauf gearbeitet habe, habe ich die Lösung für das Base64 Bild gefunden .. Ich sende die komplette Lösung hier ..

    Ich möchte noch einmal danken https://stackoverflow.com/a/15617341/1114536 für die Basis Antwort ..

    Stellt sich heraus, die Antwort, die ich als Referenz war nur Kopie dieser asnwer ..

    URLDrawable.java

     import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; 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); } } } 

    URLImageParser.java

     import java.io.InputStream; import java.net.URL; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.text.Html.ImageGetter; import android.util.Base64; import android.view.View; public class URLImageParser implements ImageGetter { Context context; View container; public URLImageParser(View container, Context context) { this.context = context; this.container = container; } public Drawable getDrawable(String source) { if(source.matches("data:image.*base64.*")) { String base_64_source = source.replaceAll("data:image.*base64", ""); byte[] data = Base64.decode(base_64_source, Base64.DEFAULT); Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); Drawable image = new BitmapDrawable(context.getResources(), bitmap); image.setBounds(0, 0, 0 + image.getIntrinsicWidth(), 0 + image.getIntrinsicHeight()); return image; } else { URLDrawable urlDrawable = new URLDrawable(); ImageGetterAsyncTask asyncTask = new ImageGetterAsyncTask(urlDrawable); asyncTask.execute(source); return urlDrawable; //return reference to URLDrawable where We will change with actual image from the src tag } } 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) { urlDrawable.setBounds(0, 0, 0 + result.getIntrinsicWidth(), 0 + result.getIntrinsicHeight()); //set the correct bound according to the result from HTTP call urlDrawable.drawable = result; //change the reference of the current drawable to the result from the HTTP call URLImageParser.this.container.invalidate(); //redraw the image by invalidating the container } public Drawable fetchDrawable(String urlString) { try { InputStream is = (InputStream) new URL(urlString).getContent(); Drawable drawable = Drawable.createFromStream(is, "src"); drawable.setBounds(0, 0, 0 + drawable.getIntrinsicWidth(), 0 + drawable.getIntrinsicHeight()); return drawable; } catch (Exception e) { return null; } } } } 

    Verwendung:

     TextView comment_content_container = ((TextView)findViewById(R.id.comment_content)); comment_content_container.setText(Html.fromHtml(comment.content, new URLImageParser(comment_content_container, this), null)); 

    Wenn jemand eine bessere Regex für die Base64 kennt, antworte ich bitte, dass ich die Antwort aktualisieren werde.

    Als extra zu Rajat Singhals Antwort (sorry, ich habe nicht genug Reputation, um einen Kommentar zu posten):

    Mein Zug war die falsche Größe (es war kleiner), weil die Zeichenköpfe die Bildschirmdichte berücksichtigen. Um die ursprüngliche Bildgröße zu bewahren, habe ich dies geschafft, in der fetchDrawable-Methode:

     public Drawable fetchDrawable(String urlString) { try { InputStream is = (InputStream) new URL(urlString).getContent(); Bitmap bmp = BitmapFactory.decodeStream(is); Drawable drawable = new BitmapDrawable (context.getResources(), bmp); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); return drawable; } catch (Exception e) { return null; } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.