Comment charger une ImageView par URL dans Android? [fermé]

530

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

Praveen
la source
1
essayez celui-ci stackoverflow.com/questions/14332296/…
comeGetSome
2
Utilisez Picasso ... stackoverflow.com/a/23865531/3535286
chiragkyada

Réponses:

713

Du 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 vous disposez des autorisations suivantes AndroidManifest.xmlpour accéder à Internet.

<uses-permission android:name="android.permission.INTERNET" />
Développeur Android
la source
39
C'est génial. Et devrait être beaucoup plus élevé sur la liste. L'asynctask permet de charger ceci sans geler l'interface utilisateur!
Kyle Clegg
3
AsyncTasks utilise un exécuteur série, ce qui signifie que chaque image se chargera une à la fois et ne fera pas de chargement de thread parallèle.
Blundell
2
Le lien source ne fonctionne plus ...
hecvd
10
Le flux d'entrée n'est pas fermé dans votre exemple. Le mieux est de faire dans le bloc enfin de votre essai / capture.
Risadinha
2
Cette méthode est-elle toujours pertinente? Je suis un peu confus au sujet de la méthode OnClick () et de son objectif
tccpg288
170

1. Picasso permet un chargement d'image sans tracas dans votre application, souvent sur une seule ligne de code!

Utilisez Gradle:

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

Une seule ligne de code!

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

2. Glide Une bibliothèque de chargement et de mise en cache d'images pour Android axée sur un défilement fluide

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. fresco est un système puissant pour afficher des images dans des applications Android.

Premiers pas avec Fresco

chiragkyada
la source
2
Donc, si l'URL est localhost, cela signifie que l'image se trouve dans la base de données du serveur local du système en développement comme xampp, toujours incapable de récupérer l'image à partir de l'url =.
blackjack
2
@blackjack - localhost de l'application serait le smartphone lui-même. Pour accéder à votre système de développement, le smartphone et votre système de développement devront être dans le même réseau et vous devrez utiliser l'adresse IP de votre système de développement dans ce réseau.
Ridcully
1
est-il possible d'utiliser picasso pour charger l'image sur le bouton?
mahdi
1
@chiragkyada j'essaye avec ce code Picasso.with (context) .load (url) .into (button_view); mais il affiche une erreur pour: into (button_view)
mahdi
1
Je pense que cela devrait être la réponse acceptée
Udo
150

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

Utilisez ensuite Imageview.setImageBitmap pour définir le bitmap dans ImageView

Steve
la source
126
tu as raison. mais juste ces 3 lignes aident à résoudre le problème. URL newurl = nouvelle URL (photo_url_str); mIcon_val = BitmapFactory.decodeStream (newurl.openConnection () .getInputStream ()); profile_photo.setImageBitmap (mIcon_val); merci pour votre réponse.
Praveen
2
Pour URL - import java.net.URL; int statique final privé IO_BUFFER_SIZE = 4 * 1024; quel était le dernier?
Steve
12
Voir le code ici: stackoverflow.com/questions/3118691/…
OneWorld
@SACPK, vous devez écrire votre commentaire en tant que réponse afin qu'il puisse être voté
Jim Wallace
la réponse était bonne pour moi, postez-la comme réponse :)
omnia Mm
71

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 une ImageView avec une image qui se trouve à une URL.

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

UrlImageViewHelper téléchargera, enregistrera et mettra en cache automatiquement toutes les URL d'image des 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, donc dès que l'image n'est plus utilisée par vous, elle sera automatiquement récupérée.

koush
la source
Au fait, quelle est la licence?
Ehtesh Choudhury
@Shurane - Apache. J'en prendrai note plus tard.
koush
1
Il semble que nous devons utiliser celui-ci à la place github.com/koush/ion car UrlImageViewHelper a été déprécié comme indiqué sur la page du projet github à github.com/koush/UrlImageViewHelper .
Svetoslav Marinov
69

Quoi qu'il en soit, les gens demandent mon commentaire pour le poster comme réponse. je poste.

URL newurl = new URL(photo_url_str); 
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);
Praveen
la source
c'est court et génial, merci
Nactus
18
mm .. cela ne peut pas être fait depuis le thread d'interface utilisateur.
Guy
2
Pour les personnes ayant des problèmes avec "Exemption d'URL mal formée", entourez les lignes ci-dessus dans un essai / capture. stackoverflow.com/a/24418607/2093088
Riot Goes Woof
1
Cela devrait être fait en utilisant AsyncTask comme décrit ci-dessus
B-GangsteR
63

La réponse acceptée ci-dessus est excellente si vous chargez l'image sur la base d'un clic sur un bouton, mais si vous le faites dans une nouvelle activité, elle fige l'interface utilisateur pendant une seconde ou deux. En regardant autour de moi, j'ai constaté qu'une simple asynctask a éliminé 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 à partir de 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 vue d'image qui apparaît une fraction de seconde plus tard en fonction de la vitesse du réseau de l'utilisateur.

Kyle Clegg
la source
C'était rapide et compact. Répondait bien à mes besoins! Merci!
Mark Murphy
dès mon horodatage, cela a fonctionné pour moi!
Carpk
25

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 d'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");
Blundell
la source
Bel échantillon, mais je ne pense pas que ce soit sûr pour les threads. J'essaie de l'utiliser dans un Async onPostExecute, mais onPostExecute peut parfois se terminer avant la réception du rappel, ce qui rend une image nulle.
Jimmy
Cela gère son propre thread. Alors pourquoi ne pas demander à votre ASyncTask de revenir à l'interface utilisateur lorsqu'elle est terminée, avec l'URL que vous souhaitez. De cette façon, vous n'avez pas de threads générant des threads.
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
la source
Merci beaucoup, l'exemple parfait que je cherchais ................, mais sous une mauvaise rubrique, cela aurait dû être ici ==> Comment définir l'image d'une imageView à partir d'une chaîne ?
VenomVendor
10

Salut, j'ai le code le plus simple, essayez 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

Abhishek Karande
la source
10

À mon avis, la meilleure bibliothèque moderne pour une telle tâche est Picasso by Square. Il permet de charger une image dans une ImageView par URL avec un liner:

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

J'ai récemment trouvé un fil ici , car je dois faire une chose similaire pour une liste avec des images, mais le principe est simple, comme vous pouvez le lire dans le premier exemple de classe montré 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 dessinable et vous pouvez la transmettre à ImageView (via setImageDrawable). Encore une fois à partir de l'extrait de code supérieur, jetez un œil à l'ensemble du thread.

InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
Djumaka
la source
Je n'ai pas DefaultHttpClient dans mon projet.
Stepan Yakovenko
8

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

MISE À JOUR : J'ai fini par écrire un article de blog à ce sujet , alors consultez-le pour obtenir de l'aide sur l'utilisation de SmartImageView.

2ÈME MISE À JOUR : J'utilise maintenant toujours Picasso pour cela (voir ci-dessus) et je le recommande fortement. :)

Ben Jakuben
la source
7

Ceci est une réponse tardive, comme suggéré ci AsyncTask- dessus et après avoir googlé un peu, j'ai trouvé un autre moyen de résoudre 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.xmlpour accéder à Internet.

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

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

IgniteCoders
la source
C'est en fait très bien pour le minimalisme! Gardez juste à l'esprit qu'il est nécessaire de s'exécuter en supplément Threadcar le thread d'interface utilisateur ne permet pas les opérations réseau.
creativecreatorormaybenot
6
imageView.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));//try/catch IOException and MalformedURLException outside
yingted
la source
5

Cela vous aidera ...

Définissez l'imageview et chargez l'image dedans .....

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

Définissez ensuite 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;
}
Mitul Goti
la source
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
la source
4

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

Un moyen simple et propre de le faire est d'utiliser la bibliothèque open source Prime .

HandlerExploit
la source
3

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());
MONICA
la source
3

Travailler pour imageView dans n'importe quel conteneur, comme la vue de la liste de la grille, la mise en page 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 );
Vinayak
la source
+1 merci pour une solution complète et facile.
PeteH
3

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

Ici, j'explique comment utiliser la bibliothèque externe "AndroidQuery" pour charger l'image de l'url / serveur de manière asyncTask avec également une image chargée dans le fichier de périphérique ou la zone de cache.

  • Téléchargez la bibliothèque "AndroidQuery" d'ici
  • Copiez / collez ce pot dans le dossier lib du projet et ajoutez cette bibliothèque au chemin de génération du projet
  • Maintenant, je montre une démonstration de la façon de l'utiliser.

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
la source
3

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

Jetez un oeil ici .

Je pense que c'est la meilleure approche.

Bruno Krebs
la source