webentwicklung-frage-antwort-db.com.de

Wie lade ich eine ImageView per URL in Android?

Wie verwende ich ein Bild, auf das eine URL verweist, in einem ImageView?

510
Praveen

Wie auch immer, 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);

vielen Dank.

64
Praveen

Von 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 in Ihrem AndroidManifest.xml die folgenden Berechtigungen für den Zugriff auf das Internet festgelegt haben.

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

1. Picasso sorgt für Ärger Kostenloses Laden von Bildern in Ihre Anwendung - häufig in einer Codezeile!

Gradle verwenden:

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

Nur eine Codezeile!

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

2. Glide Ein Bild laden und Caching-Bibliothek für Android mit Fokus auf flüssigem Scrollen

Gradle verwenden:

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 mächtiges System zum Anzeigen von Bildern in Android Anwendungen. Fresco übernimmt das Laden und Anzeigen von Bildern, sodass Sie dies nicht tun müssen.

Erste Schritte mit Fresco

153
chiragkyada

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

150
Steve

Ich habe eine Klasse dafür geschrieben, da dies in meinen verschiedenen Projekten ein immer wiederkehrender Bedarf 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 alle Bild-URLs der BitmapDrawables automatisch herunter, speichert sie und speichert sie im Cache. Doppelte URLs werden nicht zweimal in den Speicher geladen. Der Bitmap-Speicher wird mithilfe einer schwachen Referenz-Hash-Tabelle verwaltet. Sobald das Bild von Ihnen nicht mehr verwendet wird, wird es automatisch als Müll gesammelt.

70
koush

Die oben akzeptierte Antwort ist großartig, wenn Sie das Bild auf der Grundlage eines Tastenklicks 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 asynchrone Aufgabe dieses Problem beseitigte.

Um eine asynchrone Aufgabe 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);
    }    
}

Und rufen Sie von Ihrer onCreate () -Methode aus auf mit:

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.

61
Kyle Clegg

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");
25
Blundell
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;
}
}
10
pragna

Hallo, ich habe den einfachsten Code ausprobiert

    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

10

Ich habe kürzlich einen Thread gefunden hier , da ich für eine Listenansicht mit Bildern etwas Ähnliches tun muss, aber das Prinzip ist einfach, wie Sie in der dort gezeigten ersten Beispielklasse nachlesen 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 ImageView übergeben (über setImageDrawable). Schauen Sie sich noch einmal den gesamten Thread aus dem oberen Codeausschnitt an.

InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
9
Djumaka

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

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

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

UPDATE: Am Ende habe ich ein Blog-Beitrag darüber geschrieben. Weitere Informationen zur Verwendung von SmartImageView finden Sie in diesem Artikel.

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

8
Ben Jakuben

Dies ist eine späte Antwort, wie oben vorgeschlagen. AsyncTask wird 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 in Ihrem AndroidManifest.xml hinzuzufügen, um auf das Internet zuzugreifen.

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

Ich habe es selbst versucht und ich habe noch keine Probleme.

7
user1707035

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

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
7
makovkastar
imageView.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));//try/catch IOException and MalformedURLException outside
6
yingted

Das wird dir helfen...

Bildansicht definieren und Bild laden .....

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;
}
5
Mitul Goti

Arbeiten mit 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 );
3
Vinayak

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 in asyncTask-Weise verwendet wird, wobei auch Bilder in Gerätedatei oder Cache-Bereich zwischengespeichert werden.

  • Laden Sie die "AndroidQuery" -Bibliothek herunter von hier
  • Kopieren Sie diese JAR-Datei in den Projekt-Lib-Ordner und fügen Sie diese Bibliothek zum Projekt-Erstellungspfad hinzu
  • Jetzt zeige ich Demo, wie man es benutzt.

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.
3
Haresh Chhelana

Version mit Ausnahmebehandlung und Async-Task:

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

Dieser Code ist getestet und 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());
3
MONICA
    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;
    } 
3
SoH

Eine einfache und saubere Möglichkeit hierfür ist die Verwendung der Open-Source-Bibliothek Prime .

3
HandlerExploit

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

Schauen Sie sich hier an.

Ich denke, das ist der beste Ansatz.

3
Bruno Krebs
    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);
3