Wie lade ich eine ImageView per URL in Android? [geschlossen]

530

Wie verwendet man ein Bild, auf das durch eine URL verwiesen wird ImageView?

Praveen
quelle
1
Probieren
Sie
2
Verwenden Sie Picasso ... stackoverflow.com/a/23865531/3535286
chiragkyada

Antworten:

713

Vom Android-Entwickler :

// show The Image in a ImageView
new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
            .execute("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");

public void onClick(View v) {
    startActivity(new Intent(this, IndexActivity.class));
    finish();

}

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

Stellen Sie sicher, dass Sie die folgenden Berechtigungen für den AndroidManifest.xmlZugriff auf das Internet festgelegt haben.

<uses-permission android:name="android.permission.INTERNET" />
Android-Entwickler
quelle
39
Das ist fantastisch. Und sollte viel weiter oben auf der Liste stehen. Die Asynctask ermöglicht das Laden, ohne die Benutzeroberfläche einzufrieren!
Kyle Clegg
3
AsyncTasks verwendet einen seriellen Executor, dh jedes Bild wird einzeln geladen und nicht parallel geladen.
Blundell
2
Quelllink
10
Der Eingabestream ist in Ihrem Beispiel nicht geschlossen. Am besten im letzten Block Ihres Try / Catch.
Risadinha
2
Ist diese Methode noch relevant? Ich bin ein bisschen verwirrt über die OnClick () -Methode und ihren Zweck
tccpg288
170

1. Picasso ermöglicht das problemlose Laden von Bildern in Ihre Anwendung - häufig in einer Codezeile!

Verwenden Sie Gradle:

implementation 'com.squareup.picasso:picasso:2.71828'

Nur eine Codezeile!

Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);

2. Glide Eine Bibliothek zum Laden und Zwischenspeichern von Bildern für Android, die sich auf reibungsloses Scrollen konzentriert

Verwenden Sie Gradle:

repositories {
  mavenCentral() 
  google()
}

dependencies {
   implementation 'com.github.bumptech.glide:glide:4.7.1'
   annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
}

// Für eine einfache Ansicht:

  Glide.with(this).load("http://i.imgur.com/DvpvklR.png").into(imageView);

3. fresco ist ein leistungsstarkes System zum Anzeigen von Bildern in Android-Anwendungen . Fresco kümmert sich um das Laden und Anzeigen von Bildern, sodass Sie dies nicht tun müssen.

Erste Schritte mit Fresco

Chiragkyada
quelle
2
Wenn die URL also localhost ist, bedeutet dies, dass sich das Image wie xampp in der lokalen Serverdatenbank des Entwicklungssystems befindet und das Image dennoch von der url = abgerufen werden kann.
Blackjack
2
@blackjack - localhost aus der App wäre das Smartphone selbst. Um auf Ihr Entwicklungssystem zugreifen zu können, müssen sich das Smartphone und Ihr Entwicklungssystem im selben Netzwerk befinden und Sie müssen die IP-Adresse Ihres Entwicklungssystems in diesem Netzwerk verwenden.
Ridcully
1
Ist es möglich, mit Picasso ein Bild auf die Schaltfläche zu laden?
Mahdi
1
@chiragkyada Ich versuche mit diesem Code Picasso.with (Kontext) .load (URL) .into (button_view); aber es zeigt Fehler für: in (button_view)
Mahdi
1
Ich denke, dies sollte die akzeptierte Antwort sein
Udo
150

Sie müssen zuerst das Bild herunterladen

public static Bitmap loadBitmap(String url) {
    Bitmap bitmap = null;
    InputStream in = null;
    BufferedOutputStream out = null;

    try {
        in = new BufferedInputStream(new URL(url).openStream(), IO_BUFFER_SIZE);

        final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
        out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
        copy(in, out);
        out.flush();

        final byte[] data = dataStream.toByteArray();
        BitmapFactory.Options options = new BitmapFactory.Options();
        //options.inSampleSize = 1;

        bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,options);
    } catch (IOException e) {
        Log.e(TAG, "Could not load Bitmap from: " + url);
    } finally {
        closeStream(in);
        closeStream(out);
    }

    return bitmap;
}

Verwenden Sie dann die Imageview.setImageBitmap, um die Bitmap in der ImageView festzulegen

Steve
quelle
126
Du hast Recht. Aber nur diese 3 Zeilen helfen, das Problem zu lösen. URL newurl = neue URL (photo_url_str); mIcon_val = BitmapFactory.decodeStream (newurl.openConnection () .getInputStream ()); profile_photo.setImageBitmap (mIcon_val); Danke für deine Antwort.
Praveen
2
Für URL - importiere java.net.URL; private static final int IO_BUFFER_SIZE = 4 * 1024; Was war der letzte?
Steve
12
Siehe den Code hier: stackoverflow.com/questions/3118691/…
OneWorld
@SACPK Sie sollten Ihren Kommentar als Antwort schreiben, damit er abgestimmt werden kann
Jim Wallace
Die Antwort war richtig für mich, poste sie als Antwort :)
Omnia Mm
71

Ich habe eine Klasse geschrieben, um damit umzugehen, da es in meinen verschiedenen Projekten ein wiederkehrendes Bedürfnis zu sein scheint:

https://github.com/koush/UrlImageViewHelper

UrlImageViewHelper füllt eine ImageView mit einem Bild, das unter einer URL gefunden wird.

Das Beispiel führt eine Google Bildsuche durch und lädt / zeigt die Ergebnisse asynchron an.

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.

Koush
quelle
Was ist die Lizenz dafür übrigens?
Ehtesh Choudhury
@ Shurane - Apache. Ich werde es später notieren.
Koush
1
Es scheint, dass wir dieses stattdessen verwenden müssen, github.com/koush/ion, da UrlImageViewHelper veraltet ist, wie auf der Seite des Github-Projekts unter github.com/koush/UrlImageViewHelper gezeigt .
Svetoslav Marinov
69

Wie auch immer, die Leute bitten meinen Kommentar, ihn als Antwort zu posten. Ich poste.

URL newurl = new URL(photo_url_str); 
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);
Praveen
quelle
Das ist kurz und großartig, danke
Nactus
18
mm .. dies kann jedoch nicht über den UI-Thread erfolgen.
Guy
2
Wenn Sie Probleme mit "Malformed URL Exeption" haben, umgeben Sie die obigen Zeilen mit einem Try / Catch. stackoverflow.com/a/24418607/2093088
Riot Goes Woof
1
Dies sollte mit AsyncTask wie oben beschrieben erfolgen
B-GangsteR
63

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

Um eine Asynctask zu verwenden, fügen Sie diese Klasse am Ende Ihrer Aktivität hinzu:

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

Das Ergebnis ist eine schnell geladene Aktivität und eine Bildansicht, die je nach Netzwerkgeschwindigkeit des Benutzers einen Sekundenbruchteil später angezeigt wird.

Kyle Clegg
quelle
Das war schnell und kompakt. Erfüllte meine Bedürfnisse gut! Vielen Dank!
Mark Murphy
Ab meinem Zeitstempel hat das bei mir funktioniert!
Carpk
25

Sie können diese LoadingImageView-Ansicht auch verwenden, um ein Bild von einer URL zu laden:

http://blog.blundellapps.com/imageview-with-loading-spinner/

Nachdem Sie die Klassendatei über diesen Link hinzugefügt haben, können Sie eine URL-Bildansicht instanziieren:

in xml:

<com.blundell.tut.LoaderImageView
  android:id="@+id/loaderImageView"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  image="http://developer.android.com/images/dialog_buttons.png"
 />

In Code:

final LoaderImageView image = new LoaderImageView(this, "http://developer.android.com/images/dialog_buttons.png");

Und aktualisieren Sie es mit:

image.setImageDrawable("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");
Blundell
quelle
Schöne Probe, aber ich glaube nicht, dass dies threadsicher ist. Ich versuche, es in einem asynchronen onPostExecute zu verwenden, aber das onPostExecute kann manchmal enden, bevor der Rückruf empfangen wird und ein Nullbild gerendert wird.
Jimmy
Dies verwaltet seinen eigenen Thread. Lassen Sie Ihre ASyncTask nach Abschluss der gewünschten URL mit der gewünschten URL an die Benutzeroberfläche zurückrufen. Auf diese Weise haben Sie keine Threads, die Threads erzeugen.
Blundell
10
public class LoadWebImg extends Activity {

String image_URL=
 "http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png";

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

       ImageView bmImage = (ImageView)findViewById(R.id.image);
    BitmapFactory.Options bmOptions;
    bmOptions = new BitmapFactory.Options();
    bmOptions.inSampleSize = 1;
    Bitmap bm = LoadImage(image_URL, bmOptions);
    bmImage.setImageBitmap(bm);
   }

   private Bitmap LoadImage(String URL, BitmapFactory.Options options)
   {       
    Bitmap bitmap = null;
    InputStream in = null;       
       try {
           in = OpenHttpConnection(URL);
           bitmap = BitmapFactory.decodeStream(in, null, options);
           in.close();
       } catch (IOException e1) {
       }
       return bitmap;               
   }

private InputStream OpenHttpConnection(String strURL) throws IOException{
 InputStream inputStream = null;
 URL url = new URL(strURL);
 URLConnection conn = url.openConnection();

 try{
  HttpURLConnection httpConn = (HttpURLConnection)conn;
  httpConn.setRequestMethod("GET");
  httpConn.connect();

  if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
   inputStream = httpConn.getInputStream();
  }
 }
 catch (Exception ex)
 {
 }
 return inputStream;
}
}
Pragna
quelle
Vielen Dank, das perfekte Beispiel, nach dem ich gesucht habe ................, aber unter falschem Thema sollte dies hier gewesen sein ==> So setzen Sie das Bild einer imageView aus einer Zeichenfolge ?
VenomVendor
10

Hallo, ich habe den einfachsten Code, versuche dies

    public class ImageFromUrlExample extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);  
            ImageView imgView =(ImageView)findViewById(R.id.ImageView01);
            Drawable drawable = LoadImageFromWebOperations("http://www.androidpeople.com/wp-content/uploads/2010/03/android.png");
            imgView.setImageDrawable(drawable);

    }

    private Drawable LoadImageFromWebOperations(String url)
    {
          try{
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, "src name");
        return d;
      }catch (Exception e) {
        System.out.println("Exc="+e);
        return null;
      }
    }
   }

main.xml

  <LinearLayout 
    android:id="@+id/LinearLayout01"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
   <ImageView 
       android:id="@+id/ImageView01"
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content"/>

Versuche dies

Abhishek Karande
quelle
10

Die beste moderne Bibliothek für eine solche Aufgabe ist meiner Meinung nach Picasso by Square. Es ermöglicht das Laden eines Bildes in eine ImageView per URL mit einem Einzeiler:

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
Makovkastar
quelle
9

Ich habe kürzlich hier einen Thread gefunden , da ich für eine Listenansicht mit Bildern etwas Ähnliches tun muss, aber das Prinzip ist einfach, wie Sie in der ersten dort gezeigten Beispielklasse lesen können (von jleedev). Sie erhalten den Eingabestream des Bildes (aus dem Web)

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

Anschließend speichern Sie das Bild als Drawable und können es an die ImageView übergeben (über setImageDrawable). Schauen Sie sich noch einmal aus dem oberen Code-Snippet den gesamten Thread an.

InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
Djumaka
quelle
Ich habe DefaultHttpClient nicht in meinem Projekt.
Stepan Yakovenko
8

Viele gute Infos hier ... Ich habe kürzlich eine Klasse namens SmartImageView gefunden, die bisher sehr gut zu funktionieren scheint. Sehr einfach zu integrieren und zu verwenden.

http://loopj.com/android-smart-image-view/

https://github.com/loopj/android-smart-image-view

UPDATE : Am Ende habe ich einen Blog-Beitrag darüber geschrieben. Lesen Sie daher die Hilfe zur Verwendung von SmartImageView.

2. UPDATE : Ich benutze jetzt immer Picasso dafür (siehe oben) und kann es nur empfehlen. :) :)

Ben Jakuben
quelle
7

Dies ist eine späte Antwort, wie oben vorgeschlagen AsyncTask, und nachdem ich ein bisschen gegoogelt habe, habe ich einen weiteren Weg für dieses Problem gefunden.

Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");

imageView.setImageDrawable(drawable);

Hier ist die komplette Funktion:

public void loadMapPreview () {
    //start a background thread for networking
    new Thread(new Runnable() {
        public void run(){
            try {
                //download the drawable
                final Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");
                //edit the view in the UI thread
                imageView.post(new Runnable() {
                    public void run() {
                        imageView.setImageDrawable(drawable);
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

Vergessen Sie nicht, die folgenden Berechtigungen hinzuzufügen, AndroidManifest.xmlum auf das Internet zuzugreifen.

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

Ich habe es selbst versucht und habe noch kein Problem.

IgniteCoders
quelle
Das ist eigentlich sehr schön für Minimalismus! Denken Sie daran, dass eine zusätzliche Ausführung erforderlich ist, Threadda der UI-Thread keine Netzwerkoperationen zulässt.
CreativeCreatorormaybenot
6
imageView.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));//try/catch IOException and MalformedURLException outside
yingted
quelle
5

Das wird dir helfen...

Definieren Sie die Bildansicht und laden Sie das Bild hinein .....

Imageview i = (ImageView) vv.findViewById(R.id.img_country);
i.setImageBitmap(DownloadFullFromUrl(url));

Dann definieren Sie diese Methode:

    public Bitmap DownloadFullFromUrl(String imageFullURL) {
    Bitmap bm = null;
    try {
        URL url = new URL(imageFullURL);
        URLConnection ucon = url.openConnection();
        InputStream is = ucon.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);
        ByteArrayBuffer baf = new ByteArrayBuffer(50);
        int current = 0;
        while ((current = bis.read()) != -1) {
            baf.append((byte) current);
        }
        bm = BitmapFactory.decodeByteArray(baf.toByteArray(), 0,
                baf.toByteArray().length);
    } catch (IOException e) {
        Log.d("ImageManager", "Error: " + e);
    }
    return bm;
}
Mitul Goti
quelle
4
    String img_url= //url of the image
    URL url=new URL(img_url);
    Bitmap bmp; 
    bmp=BitmapFactory.decodeStream(url.openConnection().getInputStream());
    ImageView iv=(ImageView)findviewById(R.id.imageview);
    iv.setImageBitmap(bmp);
Srinivas Kattimani
quelle
4

Version mit Ausnahmebehandlung und asynchroner Aufgabe:

AsyncTask<URL, Void, Boolean> asyncTask = new AsyncTask<URL, Void, Boolean>() {
    public Bitmap mIcon_val;
    public IOException error;

    @Override
    protected Boolean doInBackground(URL... params) {
        try {
            mIcon_val = BitmapFactory.decodeStream(params[0].openConnection().getInputStream());
        } catch (IOException e) {
            this.error = e;
            return false;
        }
        return true;
    }

    @Override
    protected void onPostExecute(Boolean success) {
        super.onPostExecute(success);
        if (success) {
            image.setImageBitmap(mIcon_val);
        } else {
            image.setImageBitmap(defaultImage);
        }
    }
};
try {
    URL url = new URL(url);
    asyncTask.execute(url);
} catch (MalformedURLException e) {
    e.printStackTrace();
}
MatheusJardimB
quelle
3
    private Bitmap getImageBitmap(String url) {
        Bitmap bm = null;
        try {
            URL aURL = new URL(url);
            URLConnection conn = aURL.openConnection();
            conn.connect();
            InputStream is = conn.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            bm = BitmapFactory.decodeStream(bis);
            bis.close();
            is.close();
       } catch (IOException e) {
           Log.e(TAG, "Error getting bitmap", e);
       }
       return bm;
    } 
SoH
quelle
3

Eine einfache und saubere Möglichkeit, dies zu tun, ist die Verwendung der Open-Source-Bibliothek Prime .

HandlerExploit
quelle
3

Dieser Code ist getestet, er funktioniert vollständig.

URL req = new URL(
"http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png"
);
Bitmap mIcon_val = BitmapFactory.decodeStream(req.openConnection()
                  .getInputStream());
MONICA
quelle
3

Arbeiten für imageView in einem beliebigen Container, z. B. Listenansicht-Rasteransicht, normales Layout

 private class LoadImagefromUrl extends AsyncTask< Object, Void, Bitmap > {
        ImageView ivPreview = null;

        @Override
        protected Bitmap doInBackground( Object... params ) {
            this.ivPreview = (ImageView) params[0];
            String url = (String) params[1];
            System.out.println(url);
            return loadBitmap( url );
        }

        @Override
        protected void onPostExecute( Bitmap result ) {
            super.onPostExecute( result );
            ivPreview.setImageBitmap( result );
        }
    }

    public Bitmap loadBitmap( String url ) {
        URL newurl = null;
        Bitmap bitmap = null;
        try {
            newurl = new URL( url );
            bitmap = BitmapFactory.decodeStream( newurl.openConnection( ).getInputStream( ) );
        } catch ( MalformedURLException e ) {
            e.printStackTrace( );
        } catch ( IOException e ) {

            e.printStackTrace( );
        }
        return bitmap;
    }
/** Usage **/
  new LoadImagefromUrl( ).execute( imageView, url );
Vinayak
quelle
+1 danke für die vollständige, einfache Lösung.
PeteH
3

Versuchen Sie es auf diese Weise und hoffen Sie, dass dies Ihnen bei der Lösung Ihres Problems hilft.

Hier erkläre ich, wie die externe Bibliothek "AndroidQuery" zum Laden von Bildern von URL / Server auf asynchrone Weise verwendet wird, wobei auch geladene Bilder in Gerätedateien oder Cache-Bereiche zwischengespeichert werden.

  • Laden Sie hier die Bibliothek "AndroidQuery" herunter
  • Kopieren Sie diese JAR-Datei in den Projektbibliotheksordner und fügen Sie sie hinzu
  • Jetzt zeige ich eine Demo zur Verwendung.

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center">

        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/imageFromUrl"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:adjustViewBounds="true"/>
            <ProgressBar
                android:id="@+id/pbrLoadImage"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"/>

        </FrameLayout>
    </LinearLayout>

MainActivity.java

public class MainActivity extends Activity {

private AQuery aQuery;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    aQuery = new AQuery(this);
    aQuery.id(R.id.imageFromUrl).progress(R.id.pbrLoadImage).image("http://itechthereforeiam.com/wp-content/uploads/2013/11/android-gone-packing.jpg",true,true);
 }
}

Note : Here I just implemented common method to load image from url/server but you can use various types of method which can be provided by "AndroidQuery"to load your image easily.
Haresh Chhelana
quelle
3

Android Query kann das für Sie und vieles mehr erledigen (wie Cache und Ladevorgang).

Schauen Sie sich hier an .

Ich denke, das ist der beste Ansatz.

Bruno Krebs
quelle