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

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

468
demandé sur Peter O. 2010-03-18 20:18:06

23 réponses

à Partir de Android developer :

// 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 avez les permissions suivantes définies dans votre AndroidManifest.xml pour accéder à internet.

<uses-permission android:name="android.permission.INTERNET" />
664
répondu Android Developer 2016-01-18 16:15:02

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

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

puis utilisez L'Imageview.setImageBitmap pour définir bitmap dans L'ImageView

148
répondu Steve 2010-03-18 17:48:23

1. Picasso permet de charger des images sans tracas dans votre application-souvent en une seule ligne de code!

Use Grad:

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 de chargement et la mise en cache de la bibliothèque pour Android se concentre sur le défilement en douceur

Use Grad:

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 l'affichage d'images dans Android application.Fresco s'occupe du chargement et de l'affichage des images, donc vous n'avez pas de.

prise en main de la Fresque de la

123
répondu chiragkyada 2018-07-25 10:58:08

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

https://github.com/koush/UrlImageViewHelper

UrlImageViewHelper remplira une ImageView avec une image trouvée à une URL.

L'échantillon va faire une image Google Rechercher et charger/afficher les résultats asynchrone.

UrlImageViewHelper automatiquement télécharger, sauvegarder et mettre en cache tous les l'image urls les BitmapDrawables. Dupliquer les url ne seront pas chargées dans de mémoire deux fois. La mémoire Bitmap est gérée en utilisant une table de hachage de référence faible, donc dès que l'image n'est plus utilisée par vous, il sera ordures informations collectées automatiquement.

70
répondu koush 2011-10-18 12:33:51

quoi qu'il en soit les gens demandent mon commentaire pour le poster comme réponse. je suis annonce.

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

merci.

57
répondu Praveen 2013-04-30 06:26:36

la réponse acceptée ci-dessus est excellente si vous chargez l'image à partir d'un clic de bouton, cependant si vous le faites dans une nouvelle activité, il gèle L'UI pour une seconde ou deux. En regardant autour de moi, j'ai découvert qu'une simple tâche 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 de votre méthode onCreate () en utilisant:

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

Le résultat est un activité chargée rapidement 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.

57
répondu Kyle Clegg 2015-03-09 01:13:37

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 le code:

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

et le mettre à jour en utilisant:

image.setImageDrawable("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");
25
répondu Blundell 2017-08-01 08:11:24
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
répondu pragna 2011-04-14 00:22:57

Salut j'ai le code le plus facile à essayer

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

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

essayez cette

10
répondu Abhishek Karande 2011-12-02 08:48:17

j'ai récemment trouvé un thread ici , car je dois faire une chose similaire pour un listview avec des images, mais le principe est simple, comme vous pouvez le lire dans la première classe d'échantillon montrée ici (par jleedev). Vous obtenez le flux D'entrée de l'image (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 comme dessinable et vous pouvez la passer à L'ImageView (via setImageDrawable). Encore une fois à partir de l'extrait de code supérieur jeter un coup d'oeil à l'ensemble du fil.

InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
9
répondu Djumaka 2017-05-23 12:34:38

Beaucoup de bonnes infos ici...J'ai récemment trouvé une classe appelée SmartImageView qui semble fonctionner vraiment bien pour l'instant. 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 post de blog sur ce , alors consultez-le pour obtenir de l'aide sur L'utilisation de SmartImageView.

2e mise à jour : J'utilise désormais toujours Picasso pour cela (voir ci-dessus) et je le recommande vivement. :)

8
répondu Ben Jakuben 2015-01-15 20:40:27

la meilleure bibliothèque moderne pour une telle tâche à mon avis est Picasso par carré. Il permet de charger une image dans un ImageView par URL avec un-liner:

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
7
répondu makovkastar 2014-04-17 08:55:15

il s'agit d'une réponse tardive, comme suggéré ci-dessus AsyncTask will et après googler un peu, j'ai trouvé une autre façon 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 permissions suivantes dans votre AndroidManifest.xml pour accéder à internet.

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

j'ai essayé ceci moi-même et je n'ai pas à faire face à toute question encore.

7
répondu IgniteCoders 2018-04-27 16:01:50
imageView.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));//try/catch IOException and MalformedURLException outside
6
répondu yingted 2012-01-02 05:14:41

cela vous aidera...

définit imageview et charge image dedans .....

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

puis définir 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
répondu Mitul Goti 2013-08-05 06:53:25
    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
répondu SoH 2012-02-06 12:08:05

simple et propre façon de le faire est d'utiliser la bibliothèque open source Premier .

3
répondu HandlerExploit 2012-05-02 15:15:44
    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
répondu Srinivas Kattimani 2012-09-15 13:25:55

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
répondu MONICA 2012-09-24 13:33:48

travaillant pour imageView dans n'importe quel conteneur, comme listview grid view, disposition 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
répondu Vinayak 2014-01-31 09:58:43

Version avec gestion des exceptions et tâche async:

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
répondu MatheusJardimB 2014-03-01 00:29:31

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

ici j'explique comment utiliser "AndroidQuery" bibliothèque externe pour charger l'image de l'url / serveur de manière asyncTask avec aussi l'image chargée de cache au fichier de périphérique ou la zone de cache.

  • télécharger" AndroidQuery "bibliothèque d'ici
  • copier / coller Cette Jarre dans le dossier de projet lib et ajouter ceci bibliothèque à projet de construction-chemin
  • maintenant je montre demo à 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>

activité principale.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
répondu Haresh Chhelana 2014-10-25 08:17:46

requête Android peut gérer cela pour vous et beaucoup plus (comme cache et chargement de la progression).

regardez ici .

je pense que c'est la meilleure approche.

2
répondu Bruno Krebs 2016-06-29 08:57:41