web-dev-qa-db-fra.com

Comment charger un ImageView par URL dans Android?

Comment utilisez-vous une image référencée par une URL dans un ImageView?

510
Praveen

Quoi qu'il en soit, les gens demandent à mon commentaire de l'afficher comme réponse. je poste.

URL newurl = new URL(photo_url_str); 
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);

merci.

64
Praveen

De développeur Android :

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

Assurez-vous que les autorisations suivantes sont définies dans votre AndroidManifest.xml pour accéder à Internet.

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

1. Picasso permet des tracas chargement gratuit des images dans votre application, souvent dans une seule ligne de code!

Utilisez Gradle:

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

Juste une ligne de code!

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

2. Glide Une image en cours de chargement et bibliothèque de mise en cache pour Android axée sur le défilement régulier

Utilisez Gradle:

repositories {
  mavenCentral() 
  google()
}

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

// Pour une vue simple:

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

3. fresque est un système puissant pour afficher des images dans Android applications.Fresco se charge du chargement et de l'affichage des images, pour que vous n'ayez pas à le faire.

Bien démarrer avec Fresco

153
chiragkyada

Vous devrez d'abord télécharger l'image

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

Ensuite, utilisez Imageview.setImageBitmap pour définir le bitmap dans ImageView.

150
Steve

J'ai écrit une classe pour gérer cela, car cela semble être un besoin récurrent dans mes différents projets:

https://github.com/koush/UrlImageViewHelper

UrlImageViewHelper remplira un ImageView avec une image trouvée dans une URL.

L'exemple effectuera une recherche d'images dans Google et chargera/affichera les résultats de manière asynchrone.

UrlImageViewHelper va automatiquement télécharger, enregistrer et mettre en cache toutes les adresses URL BitmapDrawables. Les URL en double ne seront pas chargées en mémoire deux fois. La mémoire bitmap est gérée à l'aide d'une table de hachage de référence faible. Ainsi, dès que vous n'utiliserez plus l'image, celle-ci sera automatiquement récupérée.

70
koush

La réponse acceptée ci-dessus est excellente si vous chargez l'image en fonction d'un clic de bouton. Toutefois, si vous le faites dans une nouvelle activité, l'interface utilisateur gèle pendant une seconde ou deux. En regardant autour de moi, j'ai trouvé qu'un simple asynchrone éliminait ce problème.

Pour utiliser un asynctask, ajoutez cette classe à la fin de votre activité:

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

Et appelez depuis votre méthode onCreate () en utilisant:

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

Le résultat est une activité rapidement chargée et une image qui apparaît une fraction de seconde plus tard, en fonction de la vitesse du réseau de l'utilisateur.

61
Kyle Clegg

Vous pouvez également utiliser cette vue LoadingImageView pour charger une image à partir d'une URL:

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

Une fois que vous avez ajouté le fichier de classe à partir de ce lien, vous pouvez instancier une vue d'image URL:

en 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"
 />

Dans du code:

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

Et mettez-le à jour en utilisant:

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

Salut j'ai le code le plus facile essayer ceci

    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"/>

essaye ça

10
Abhishek Karande

J'ai récemment trouvé un fil ici , car je dois faire la même chose pour une listview avec des images, mais le principe est simple, comme vous pouvez le lire dans le premier exemple présenté ici (par jleedev) . Vous obtenez le flux d'entrée de l'image (à partir du 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();
}

Ensuite, vous stockez l'image en tant que Drawable et vous pouvez la transmettre à ImageView (via setImageDrawable). De nouveau, à partir de l'extrait de code supérieur, jetez un coup d'œil à l'intégralité du fil de discussion.

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

Beaucoup de bonnes informations ici ... J'ai récemment trouvé une classe appelée SmartImageView qui semble fonctionner très bien jusqu'à présent. Très facile à intégrer et à utiliser.

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

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

UPDATE: J'ai fini par écrire un article de blog à ce sujet , consultez l'aide pour utiliser SmartImageView.

2ND UPDATE : J'utilise maintenant toujours Picasso pour cela (voir ci-dessus) et le recommande vivement. :)

8
Ben Jakuben

Ceci est une réponse tardive, comme suggéré ci-dessus AsyncTask sera et après googler un peu, j'ai trouvé un moyen supplémentaire pour ce problème.

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

imageView.setImageDrawable(drawable);

Voici la fonction complète:

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

N'oubliez pas d'ajouter les autorisations suivantes dans votre AndroidManifest.xml pour accéder à Internet.

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

J'ai essayé cela moi-même et je n'ai pas encore rencontré de problème.

7
user1707035

La meilleure bibliothèque moderne pour une telle tâche à mon avis est Picasso par Square. Il permet de charger une image sur un ImageView par URL avec une seule ligne:

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

Cela vous aidera ...

Définissez imageview et chargez-y l'image .....

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

Puis définissez cette méthode:

    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

Travailler pour imageView dans n’importe quel conteneur, comme la vue en grille listview, la présentation normale

 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

Essayez de cette façon, en espérant que cela vous aidera à résoudre votre problème.

J'explique ici comment utiliser la bibliothèque externe "AndroidQuery" pour charger l'image à partir d'url/server de manière asynchrone, avec également une image chargée en cache dans un fichier de périphérique ou une zone de cache.

  • Télécharger la bibliothèque "AndroidQuery" à partir d'ici
  • Copier/coller ce fichier jar dans le dossier lib du projet et ajouter cette bibliothèque au chemin de construction du projet
  • Maintenant, je montre la démonstration de son utilisation.

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 avec gestion des exceptions et tâche asynchrone:

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

Ce code est testé, il fonctionne complètement.

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

Une façon simple et propre de faire cela consiste à utiliser la bibliothèque open source Prime .

3
HandlerExploit

Android Query peut gérer cela pour vous et bien plus encore (comme la progression du cache et du chargement).

Jetez un oeil à ici .

Je pense que c'est la meilleure approche.

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
Srinivas Kattimani