Bild von URL laden

155

Ich habe eine Bild-URL. Ich möchte ein Bild von dieser URL in einer ImageView anzeigen, kann dies jedoch nicht.

Wie kann dies erreicht werden?

Sanat Pandey
quelle
Mögliches Duplikat von Wie lade ich eine ImageView per URL in Android?
Blahdiblah
Schauen Sie sich diese Fragen an und konzentrieren Sie sich auf die ersten Antworten. Hier finden Sie zwei einfache und vollständige Möglichkeiten: die erste Methode (vollständiger) oder die zweite Methode (einfacher)
lory105
Sie können Picasso und Glide Image Loader verwenden und in der Bildansicht angezeigt werden
shweta c

Antworten:

239
URL url = new URL("http://image10.bizrate-images.com/resize?sq=60&uid=2216744464");
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
imageView.setImageBitmap(bmp);
Rajath
quelle
60
Sie sollten das wirklich nicht verwenden, da es den UI-Thread blockiert. Diese Bibliothek übernimmt das Threading und Herunterladen für Sie: github.com/koush/UrlImageViewHelper
koush
16
Nicht, wenn Sie diesen Block auf einem separaten Thread abzüglich der setImageBitmap ausführen
Jonathan
Es funktioniert in Miniaturansichten und auf Bildansicht. Ich habe dsplaying dailog verwendet, aber es öffnet sich nach 10 Sekunden
Prasad
4
@koush - Dieser Code wäre in Ordnung, wenn er in einen eingeschlossen wäre AsyncTask.
Greg Brown
2
Sie sollten alle Netzwerkoperationen in einem separaten Thread ausführen. Wenn die Bitmap geladen wurde, können Sie ImageView.post () oder Handler.post ()
Volodymyr Shalashenko
310

Die oben akzeptierte Antwort ist großartig, wenn Sie das Bild basierend auf einem Klick auf eine Schaltfläche laden. Wenn Sie es jedoch in einer neuen Aktivität ausführen, wird die Benutzeroberfläche für ein oder zwei Sekunden eingefroren. Als ich mich umsah, stellte ich fest, dass eine einfache Asynctask dieses Problem beseitigte.

So verwenden Sie eine Asynctask, um diese Klasse am Ende Ihrer Aktivität hinzuzufügen:

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
  ImageView bmImage;

  public DownloadImageTask(ImageView bmImage) {
      this.bmImage = bmImage;
  }

  protected Bitmap doInBackground(String... urls) {
      String urldisplay = urls[0];
      Bitmap mIcon11 = null;
      try {
        InputStream in = new java.net.URL(urldisplay).openStream();
        mIcon11 = BitmapFactory.decodeStream(in);
      } catch (Exception e) {
          Log.e("Error", e.getMessage());
          e.printStackTrace();
      }
      return mIcon11;
  }

  protected void onPostExecute(Bitmap result) {
      bmImage.setImageBitmap(result);
  }
}

Rufen Sie von Ihrer onCreate () -Methode aus Folgendes auf:

new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
        .execute(MY_URL_STRING);

Vergessen Sie nicht, die unten stehende Berechtigung in Ihre Manifestdatei aufzunehmen

<uses-permission android:name="android.permission.INTERNET"/>

Funktioniert super für mich. :) :)

Kyle Clegg
quelle
2
Ich mag diese Lösung, Sie sollten nur Code für onPostExecute bereinigen, da sein Körper aus ist.
Sofija
das ist toll. @Sofija was meintest du mit Aufräumen? Was ist, wenn Sie eine unbekannte Anzahl von Bildern haben?
5er
@ 5er Ich hatte einige der Klammern in der ursprünglichen Antwort fehl am Platz. Ich habe es seitdem aufgeräumt, damit Sie es so verwenden können, wie es ist.
Kyle Clegg
Nicht zu vergessen, dass wir auch die Berechtigung im Manifest hinzufügen müssen: <Verwendungsberechtigung android: name = "android.permission.INTERNET" />
mike20132013
1
Dies ist großartig zum Lernen / Hacken (upvoted), aber für jede Produktion sollten Sie eine Imageloader-Bibliothek verwenden, es gibt so viele da draußen. Mein Favorit ist Universal Image Loader, Picasso usw.
AmeyaB
31

versuchen Sie es picasssoschön und endet in einer Aussage

Picasso.with(context)
                .load(ImageURL)
                .resize(width,height).into(imageView);

Tutorial: https://youtu.be/DxRqxsEPc2s

vijaicv
quelle
3
Picasso, Glide sind auch meine Favoriten. Die Aussage von Glide ist Picasso ziemlich ähnlich, mit einer deutlichen Verbesserung der Cache-Größe.
Anhtuannd
Dies sollte die neue Antwort sein, obwohl es immer schön ist zu wissen, wie man es alleine macht. Großartiger Artikel, der beide Möglichkeiten erklärt: medium.com/@crossphd/…
Martin Jäkel
9

Versuchen Sie dies, fügen Sie picasso lib jar Datei hinzu

Picasso.with(context)
                .load(ImageURL)
                .resize(width,height).noFade().into(imageView);
Rakesh Rangani
quelle
7
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;
import android.widget.Toast;

public class imageDownload {

    Bitmap bmImg;
    void downloadfile(String fileurl,ImageView img)
    {
        URL myfileurl =null;
        try
        {
            myfileurl= new URL(fileurl);

        }
        catch (MalformedURLException e)
        {

            e.printStackTrace();
        }

        try
        {
            HttpURLConnection conn= (HttpURLConnection)myfileurl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            int length = conn.getContentLength();
            int[] bitmapData =new int[length];
            byte[] bitmapData2 =new byte[length];
            InputStream is = conn.getInputStream();
            BitmapFactory.Options options = new BitmapFactory.Options();

            bmImg = BitmapFactory.decodeStream(is,null,options);

            img.setImageBitmap(bmImg);

            //dialog.dismiss();
            } 
        catch(IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
//          Toast.makeText(PhotoRating.this, "Connection Problem. Try Again.", Toast.LENGTH_SHORT).show();
        }


    }


}

Nehmen Sie in Ihrer Aktivität imageview & set resource imageDownload (url, yourImageview);


quelle
5

UrlImageViewHelper füllt eine ImageView mit einem Bild, das unter einer URL gefunden wird. UrlImageViewHelper lädt automatisch alle Bild-URLs der BitmapDrawables herunter, speichert sie und speichert sie zwischen. Doppelte URLs werden nicht zweimal in den Speicher geladen. Der Bitmap-Speicher wird mithilfe einer schwachen Referenz-Hash-Tabelle verwaltet. Sobald das Bild nicht mehr von Ihnen verwendet wird, wird der Müll automatisch gesammelt.

UrlImageViewHelper.setUrlDrawable (imageView, "http://example.com/image.png");

https://github.com/koush/UrlImageViewHelper

Koush
quelle
4

Basierend auf dieser Antwort schreibe ich meinen eigenen Lader.

Mit Ladeeffekt und Erscheinungseffekt:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ProgressBar;

import java.io.InputStream;

/**
 * Created by Sergey Shustikov ([email protected]) at 2015.
 */
public class DownloadImageTask extends AsyncTask<String, Void, Bitmap>
{
    public static final int ANIMATION_DURATION = 250;
    private final ImageView mDestination, mFakeForError;
    private final String mUrl;
    private final ProgressBar mProgressBar;
    private Animation.AnimationListener mOutAnimationListener = new Animation.AnimationListener()
    {
        @Override
        public void onAnimationStart(Animation animation)
        {

        }

        @Override
        public void onAnimationEnd(Animation animation)
        {
            mProgressBar.setVisibility(View.GONE);
        }

        @Override
        public void onAnimationRepeat(Animation animation)
        {

        }
    };
    private Animation.AnimationListener mInAnimationListener = new Animation.AnimationListener()
    {
        @Override
        public void onAnimationStart(Animation animation)
        {
            if (isBitmapSet)
                mDestination.setVisibility(View.VISIBLE);
            else
                mFakeForError.setVisibility(View.VISIBLE);
        }

        @Override
        public void onAnimationEnd(Animation animation)
        {

        }

        @Override
        public void onAnimationRepeat(Animation animation)
        {

        }
    };
    private boolean isBitmapSet;

    public DownloadImageTask(Context context, ImageView destination, String url)
    {
        mDestination = destination;
        mUrl = url;
        ViewGroup parent = (ViewGroup) destination.getParent();
        mFakeForError = new ImageView(context);
        destination.setVisibility(View.GONE);
        FrameLayout layout = new FrameLayout(context);
        mProgressBar = new ProgressBar(context);
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.gravity = Gravity.CENTER;
        mProgressBar.setLayoutParams(params);
        FrameLayout.LayoutParams copy = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        copy.gravity = Gravity.CENTER;
        copy.width = dpToPx(48);
        copy.height = dpToPx(48);
        mFakeForError.setLayoutParams(copy);
        mFakeForError.setVisibility(View.GONE);
        mFakeForError.setImageResource(android.R.drawable.ic_menu_close_clear_cancel);
        layout.addView(mProgressBar);
        layout.addView(mFakeForError);
        mProgressBar.setIndeterminate(true);
        parent.addView(layout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    }

    protected Bitmap doInBackground(String... urls)
    {
        String urlDisplay = mUrl;
        Bitmap bitmap = null;
        try {
            InputStream in = new java.net.URL(urlDisplay).openStream();
            bitmap = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return bitmap;
    }

    protected void onPostExecute(Bitmap result)
    {
        AlphaAnimation in = new AlphaAnimation(0f, 1f);
        AlphaAnimation out = new AlphaAnimation(1f, 0f);
        in.setDuration(ANIMATION_DURATION * 2);
        out.setDuration(ANIMATION_DURATION);
        out.setAnimationListener(mOutAnimationListener);
        in.setAnimationListener(mInAnimationListener);
        in.setStartOffset(ANIMATION_DURATION);
        if (result != null) {
            mDestination.setImageBitmap(result);
            isBitmapSet = true;
            mDestination.startAnimation(in);
        } else {
            mFakeForError.startAnimation(in);
        }
        mProgressBar.startAnimation(out);
    }
    public int dpToPx(int dp) {
        DisplayMetrics displayMetrics = mDestination.getContext().getResources().getDisplayMetrics();
        int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
        return px;
    }
}

Berechtigung hinzufügen

<uses-permission android:name="android.permission.INTERNET"/>

Und ausführen:

 new DownloadImageTask(context, imageViewToLoad, urlToImage).execute();
Sergey Shustikov
quelle
4

Hier ist ein Beispielcode für die Anzeige des Bildes von der URL.

public static Void downloadfile(String fileurl, ImageView img) {
        Bitmap bmImg = null;
        URL myfileurl = null;
        try {
            myfileurl = new URL(fileurl);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        try {
            HttpURLConnection conn = (HttpURLConnection) myfileurl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            int length = conn.getContentLength();
            if (length > 0) {
                int[] bitmapData = new int[length];
                byte[] bitmapData2 = new byte[length];
                InputStream is = conn.getInputStream();
                bmImg = BitmapFactory.decodeStream(is);
                img.setImageBitmap(bmImg);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
Niranj Patel
quelle
3

Beste Methode, die ich versucht habe, anstatt Bibliotheken zu verwenden

public Bitmap getbmpfromURL(String surl){
    try {
        URL url = new URL(surl);
        HttpURLConnection urlcon = (HttpURLConnection) url.openConnection();
        urlcon.setDoInput(true);
        urlcon.connect();
        InputStream in = urlcon.getInputStream();
        Bitmap mIcon = BitmapFactory.decodeStream(in);
        return  mIcon;
    } catch (Exception e) {
        Log.e("Error", e.getMessage());
        e.printStackTrace();
        return null;
    }
}
Sabari Karthik
quelle
3

Internetberechtigung im Manifest hinzufügen

<uses-permission android:name="android.permission.INTERNET" />

als Methode wie unten erstellen,

 public static Bitmap getBitmapFromURL(String src) {
    try {
        Log.e("src", src);
        URL url = new URL(src);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        Log.e("Bitmap", "returned");
        return myBitmap;
    } catch (IOException e) {
        e.printStackTrace();
        Log.e("Exception", e.getMessage());
        return null;
    }
}

Fügen Sie dies nun in Ihre onCreate-Methode ein.

 ImageView img_add = (ImageView) findViewById(R.id.img_add);


img_add.setImageBitmap(getBitmapFromURL("http://www.deepanelango.me/wpcontent/uploads/2017/06/noyyal1.jpg"));

Das funktioniert bei mir.

Jinal Awaiya
quelle
2

Der folgende Code zeigt Ihnen, wie Sie ImageView mithilfe von RxAndroid aus einer URL-Zeichenfolge festlegen. Fügen Sie zunächst die RxAndroid-Bibliothek 2.0 hinzu

dependencies {
    // RxAndroid
    compile 'io.reactivex.rxjava2:rxandroid:2.0.0'
    compile 'io.reactivex.rxjava2:rxjava:2.0.0'

    // Utilities
    compile 'org.apache.commons:commons-lang3:3.5'

}

Verwenden Sie jetzt setImageFromUrl, um das Bild festzulegen.

public void setImageFromUrl(final ImageView imageView, final String urlString) {

    Observable.just(urlString)
        .filter(new Predicate<String>() {
            @Override public boolean test(String url) throws Exception {
                return StringUtils.isNotBlank(url);
            }
        })
        .map(new Function<String, Drawable>() {
            @Override public Drawable apply(String s) throws Exception {
                URL url = null;
                try {
                    url = new URL(s);
                    return Drawable.createFromStream((InputStream) url.getContent(), "profile");
                } catch (final IOException ex) {
                    return null;
                }
            }
        })
        .filter(new Predicate<Drawable>() {
            @Override public boolean test(Drawable drawable) throws Exception {
                return drawable != null;
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Consumer<Drawable>() {
            @Override public void accept(Drawable drawable) throws Exception {
                imageView.setImageDrawable(drawable);
            }
        });
}
DàChún
quelle
2

Es gibt zwei Möglichkeiten:

1) Verwenden der Glide-Bibliothek Dies ist der beste Weg, um ein Bild von einer URL zu laden, da beim Versuch, dieselbe URL beim zweiten Mal anzuzeigen, diese von catch angezeigt wird, um die App-Leistung zu verbessern

Glide.with(context).load("YourUrl").into(imageView);

Abhängigkeit: implementation 'com.github.bumptech.glide:glide:4.10.0'


2) Verwenden von Stream. Hier möchten Sie eine Bitmap aus dem URL-Bild erstellen

URL url = new URL("YourUrl");
Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
imageView.setImageBitmap(bitmap);
Sanjayrajsinh
quelle
1
loadImage("http://relinjose.com/directory/filename.png");

Bitte schön

void loadImage(String image_location) {
    URL imageURL = null;
    if (image_location != null) {
        try {
            imageURL = new URL(image_location);         
            HttpURLConnection connection = (HttpURLConnection) imageURL
                    .openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream inputStream = connection.getInputStream();
            bitmap = BitmapFactory.decodeStream(inputStream);// Convert to bitmap
            ivdpfirst.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        //set any default
    }
}
Außergewöhnlich
quelle
Was ist ivdpfirst?
Big McLargeHuge
ID von ImageView, das im XML-Design verwendet wird.
Außergewöhnlich
1

Versuche dies:

InputStream input = contentResolver.openInputStream(httpuri);
Bitmap b = BitmapFactory.decodeStream(input, null, options);
chung
quelle
1
public class MainActivity extends Activity {

    Bitmap b;
    ImageView img;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img = (ImageView)findViewById(R.id.imageView1);
        information info = new information();
        info.execute("");
    }

    public class information extends AsyncTask<String, String, String>
    {
        @Override
        protected String doInBackground(String... arg0) {

            try
            {
                URL url = new URL("http://10.119.120.10:80/img.jpg");
                InputStream is = new BufferedInputStream(url.openStream());
                b = BitmapFactory.decodeStream(is);

            } catch(Exception e){}
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            img.setImageBitmap(b);
        }
    }
}
Rahul Raina
quelle
1

Für mich ist Fresco die beste unter den anderen Bibliotheken.

Nur Setup Fresko und dann einfach die imageURI wie folgt festgelegt:

draweeView.setImageURI(uri);

In dieser Antwort werden einige der Vorteile von Fresco erläutert.

Wilder Pereira
quelle