Charger l'image à partir de l'URL

156

J'ai une URL d'image. Je souhaite afficher une image de cette URL dans un ImageView, mais je ne peux pas le faire.

Comment cela peut il etre accompli?

Sanat Pandey
la source
Regardez ces questions et concentrez-vous sur les premières réponses, ici vous pouvez trouver deux façons simples et complètes de le faire: première méthode (plus complète) ou deuxième méthode (plus simplement)
lory105
vous pouvez utiliser le chargeur d'image Picasso et Glide et l'afficher sur imageview
shweta c

Réponses:

240
URL url = new URL("http://image10.bizrate-images.com/resize?sq=60&uid=2216744464");
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
imageView.setImageBitmap(bmp);
Rajath
la source
60
Vous ne devriez vraiment pas l'utiliser, car cela bloque le thread de l'interface utilisateur. Cette bibliothèque gérera le threading et le téléchargement pour vous: github.com/koush/UrlImageViewHelper
koush
16
Pas si vous exécutez ce bloc sur un thread séparé moins le setImageBitmap
Jonathan
son fonctionnement je l'affiche dans les vignettes et onclick imageview j'ai utilisé dsplaying dailog mais il s'ouvre après 10secs
Prasad
4
@koush - Ce code conviendrait s'il était enveloppé dans un fichier AsyncTask.
Greg Brown
2
Vous devez effectuer toutes les opérations réseau dans un thread séparé.Lorsque le bitmap a été chargé, vous pouvez utiliser ImageView.post () ou Handler.post ()
Volodymyr Shalashenko
311

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

Pour utiliser une asynctask pour ajouter 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);

N'oubliez pas d'ajouter l'autorisation ci-dessous dans votre fichier manifeste

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

Fonctionne très bien pour moi. :)

Kyle Clegg
la source
2
J'aime cette solution, vous devriez simplement nettoyer le code pour onPostExecute, car son corps est sorti.
Sofija
c'est bien. @Sofija qu'est-ce que tu voulais dire par nettoyage? et si vous avez un nombre inconnu d'images?
5er
@ 5er J'avais certains des crochets hors de propos dans la réponse originale. Depuis, je l'ai nettoyé, vous devriez donc pouvoir l'utiliser tel quel.
Kyle Clegg
N'oubliez pas que nous devons également ajouter une autorisation dans le manifeste: <uses-permission android: name = "android.permission.INTERNET" />
mike20132013
1
C'est génial pour l'apprentissage / le piratage (vote positif), mais pour toute production, vous devriez utiliser une bibliothèque Imageloader, il y en a tellement. Mon préféré est Universal Image Loader, Picasso etc.
AmeyaB
31

essayez picasssobien et se termine en une seule déclaration

Picasso.with(context)
                .load(ImageURL)
                .resize(width,height).into(imageView);

tutoriel: https://youtu.be/DxRqxsEPc2s

vijaicv
la source
3
Picasso, Glide sont aussi mes préférés. La déclaration de Glide est assez similaire à celle de Picasso, avec une amélioration considérable de la taille du cache.
anhtuannd
1
Cela devrait être la nouvelle réponse, bien qu'il soit toujours agréable de savoir comment le faire par vous-même. Excellent article expliquant les deux sens: medium.com/@crossphd/…
Martin Jäkel
9

Essayez ce fichier jar add picasso lib

Picasso.with(context)
                .load(ImageURL)
                .resize(width,height).noFade().into(imageView);
Rakesh Rangani
la source
7
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;
import android.widget.Toast;

public class imageDownload {

    Bitmap bmImg;
    void downloadfile(String fileurl,ImageView img)
    {
        URL myfileurl =null;
        try
        {
            myfileurl= new URL(fileurl);

        }
        catch (MalformedURLException e)
        {

            e.printStackTrace();
        }

        try
        {
            HttpURLConnection conn= (HttpURLConnection)myfileurl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            int length = conn.getContentLength();
            int[] bitmapData =new int[length];
            byte[] bitmapData2 =new byte[length];
            InputStream is = conn.getInputStream();
            BitmapFactory.Options options = new BitmapFactory.Options();

            bmImg = BitmapFactory.decodeStream(is,null,options);

            img.setImageBitmap(bmImg);

            //dialog.dismiss();
            } 
        catch(IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
//          Toast.makeText(PhotoRating.this, "Connection Problem. Try Again.", Toast.LENGTH_SHORT).show();
        }


    }


}

dans votre activité, prenez imageview et définissez la ressource imageDownload (url, yourImageview);


la source
5

UrlImageViewHelper remplira un ImageView avec une image qui se trouve à une URL. UrlImageViewHelper téléchargera, enregistrera et mettra automatiquement en cache 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.

UrlImageViewHelper.setUrlDrawable (imageView, "http://example.com/image.png");

https://github.com/koush/UrlImageViewHelper

koush
la source
4

Sur la base de cette réponse, j'écris mon propre chargeur.

Avec effet de chargement et effet d'apparence:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ProgressBar;

import java.io.InputStream;

/**
 * Created by Sergey Shustikov ([email protected]) at 2015.
 */
public class DownloadImageTask extends AsyncTask<String, Void, Bitmap>
{
    public static final int ANIMATION_DURATION = 250;
    private final ImageView mDestination, mFakeForError;
    private final String mUrl;
    private final ProgressBar mProgressBar;
    private Animation.AnimationListener mOutAnimationListener = new Animation.AnimationListener()
    {
        @Override
        public void onAnimationStart(Animation animation)
        {

        }

        @Override
        public void onAnimationEnd(Animation animation)
        {
            mProgressBar.setVisibility(View.GONE);
        }

        @Override
        public void onAnimationRepeat(Animation animation)
        {

        }
    };
    private Animation.AnimationListener mInAnimationListener = new Animation.AnimationListener()
    {
        @Override
        public void onAnimationStart(Animation animation)
        {
            if (isBitmapSet)
                mDestination.setVisibility(View.VISIBLE);
            else
                mFakeForError.setVisibility(View.VISIBLE);
        }

        @Override
        public void onAnimationEnd(Animation animation)
        {

        }

        @Override
        public void onAnimationRepeat(Animation animation)
        {

        }
    };
    private boolean isBitmapSet;

    public DownloadImageTask(Context context, ImageView destination, String url)
    {
        mDestination = destination;
        mUrl = url;
        ViewGroup parent = (ViewGroup) destination.getParent();
        mFakeForError = new ImageView(context);
        destination.setVisibility(View.GONE);
        FrameLayout layout = new FrameLayout(context);
        mProgressBar = new ProgressBar(context);
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.gravity = Gravity.CENTER;
        mProgressBar.setLayoutParams(params);
        FrameLayout.LayoutParams copy = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        copy.gravity = Gravity.CENTER;
        copy.width = dpToPx(48);
        copy.height = dpToPx(48);
        mFakeForError.setLayoutParams(copy);
        mFakeForError.setVisibility(View.GONE);
        mFakeForError.setImageResource(android.R.drawable.ic_menu_close_clear_cancel);
        layout.addView(mProgressBar);
        layout.addView(mFakeForError);
        mProgressBar.setIndeterminate(true);
        parent.addView(layout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    }

    protected Bitmap doInBackground(String... urls)
    {
        String urlDisplay = mUrl;
        Bitmap bitmap = null;
        try {
            InputStream in = new java.net.URL(urlDisplay).openStream();
            bitmap = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return bitmap;
    }

    protected void onPostExecute(Bitmap result)
    {
        AlphaAnimation in = new AlphaAnimation(0f, 1f);
        AlphaAnimation out = new AlphaAnimation(1f, 0f);
        in.setDuration(ANIMATION_DURATION * 2);
        out.setDuration(ANIMATION_DURATION);
        out.setAnimationListener(mOutAnimationListener);
        in.setAnimationListener(mInAnimationListener);
        in.setStartOffset(ANIMATION_DURATION);
        if (result != null) {
            mDestination.setImageBitmap(result);
            isBitmapSet = true;
            mDestination.startAnimation(in);
        } else {
            mFakeForError.startAnimation(in);
        }
        mProgressBar.startAnimation(out);
    }
    public int dpToPx(int dp) {
        DisplayMetrics displayMetrics = mDestination.getContext().getResources().getDisplayMetrics();
        int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
        return px;
    }
}

Ajouter une autorisation

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

Et exécutez:

 new DownloadImageTask(context, imageViewToLoad, urlToImage).execute();
Sergey Shustikov
la source
4

Voici un exemple de code pour afficher l'image à partir de l'URL.

public static Void downloadfile(String fileurl, ImageView img) {
        Bitmap bmImg = null;
        URL myfileurl = null;
        try {
            myfileurl = new URL(fileurl);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        try {
            HttpURLConnection conn = (HttpURLConnection) myfileurl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            int length = conn.getContentLength();
            if (length > 0) {
                int[] bitmapData = new int[length];
                byte[] bitmapData2 = new byte[length];
                InputStream is = conn.getInputStream();
                bmImg = BitmapFactory.decodeStream(is);
                img.setImageBitmap(bmImg);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
Niranj Patel
la source
3

Meilleure méthode que j'ai essayée au lieu d'utiliser des bibliothèques

public Bitmap getbmpfromURL(String surl){
    try {
        URL url = new URL(surl);
        HttpURLConnection urlcon = (HttpURLConnection) url.openConnection();
        urlcon.setDoInput(true);
        urlcon.connect();
        InputStream in = urlcon.getInputStream();
        Bitmap mIcon = BitmapFactory.decodeStream(in);
        return  mIcon;
    } catch (Exception e) {
        Log.e("Error", e.getMessage());
        e.printStackTrace();
        return null;
    }
}
Sabari Karthik
la source
3

ajouter l'autorisation Internet dans le manifeste

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

que de créer une méthode comme ci-dessous,

 public static Bitmap getBitmapFromURL(String src) {
    try {
        Log.e("src", src);
        URL url = new URL(src);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        Log.e("Bitmap", "returned");
        return myBitmap;
    } catch (IOException e) {
        e.printStackTrace();
        Log.e("Exception", e.getMessage());
        return null;
    }
}

ajoutez maintenant ceci dans votre méthode onCreate,

 ImageView img_add = (ImageView) findViewById(R.id.img_add);


img_add.setImageBitmap(getBitmapFromURL("http://www.deepanelango.me/wpcontent/uploads/2017/06/noyyal1.jpg"));

cela fonctionne pour moi.

Jinal Awaiya
la source
2

Le code ci-dessous vous montre comment définir ImageView à partir d'une chaîne d'URL, à l'aide de RxAndroid. Tout d'abord, ajoutez la bibliothèque RxAndroid 2.0

dependencies {
    // RxAndroid
    compile 'io.reactivex.rxjava2:rxandroid:2.0.0'
    compile 'io.reactivex.rxjava2:rxjava:2.0.0'

    // Utilities
    compile 'org.apache.commons:commons-lang3:3.5'

}

utilisez maintenant setImageFromUrl pour définir l'image.

public void setImageFromUrl(final ImageView imageView, final String urlString) {

    Observable.just(urlString)
        .filter(new Predicate<String>() {
            @Override public boolean test(String url) throws Exception {
                return StringUtils.isNotBlank(url);
            }
        })
        .map(new Function<String, Drawable>() {
            @Override public Drawable apply(String s) throws Exception {
                URL url = null;
                try {
                    url = new URL(s);
                    return Drawable.createFromStream((InputStream) url.getContent(), "profile");
                } catch (final IOException ex) {
                    return null;
                }
            }
        })
        .filter(new Predicate<Drawable>() {
            @Override public boolean test(Drawable drawable) throws Exception {
                return drawable != null;
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Consumer<Drawable>() {
            @Override public void accept(Drawable drawable) throws Exception {
                imageView.setImageDrawable(drawable);
            }
        });
}
DàChún
la source
2

Il y a deux manières:

1) Utilisation de la bibliothèque Glide C'est le meilleur moyen de charger l'image à partir de l'URL car lorsque vous essayez d'afficher la même URL la deuxième fois, elle s'affichera à partir de catch, alors améliorez les performances de l'application

Glide.with(context).load("YourUrl").into(imageView);

dépendance: implementation 'com.github.bumptech.glide:glide:4.10.0'


2) Utilisation de Stream. Ici, vous voulez créer un bitmap à partir d'une image URL

URL url = new URL("YourUrl");
Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
imageView.setImageBitmap(bitmap);
Sanjayrajsinh
la source
1
loadImage("http://relinjose.com/directory/filename.png");

Voici

void loadImage(String image_location) {
    URL imageURL = null;
    if (image_location != null) {
        try {
            imageURL = new URL(image_location);         
            HttpURLConnection connection = (HttpURLConnection) imageURL
                    .openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream inputStream = connection.getInputStream();
            bitmap = BitmapFactory.decodeStream(inputStream);// Convert to bitmap
            ivdpfirst.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        //set any default
    }
}
Exceptionnel
la source
Quoi ivdpfirst?
Big McLargeHuge
Id d'ImageView utilisé dans la conception xml.
Exceptionnel
1

Essaye ça:

InputStream input = contentResolver.openInputStream(httpuri);
Bitmap b = BitmapFactory.decodeStream(input, null, options);
chung
la source
1
public class MainActivity extends Activity {

    Bitmap b;
    ImageView img;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img = (ImageView)findViewById(R.id.imageView1);
        information info = new information();
        info.execute("");
    }

    public class information extends AsyncTask<String, String, String>
    {
        @Override
        protected String doInBackground(String... arg0) {

            try
            {
                URL url = new URL("http://10.119.120.10:80/img.jpg");
                InputStream is = new BufferedInputStream(url.openStream());
                b = BitmapFactory.decodeStream(is);

            } catch(Exception e){}
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            img.setImageBitmap(b);
        }
    }
}
Rahul Raina
la source
1

Pour moi, Fresco est la meilleure parmi les autres bibliothèques.

Configurez simplement Fresco, puis définissez simplement l'imageURI comme ceci:

draweeView.setImageURI(uri);

Consultez cette réponse expliquant certains des avantages de Fresco.

Wilder Pereira
la source