Cargar imagen desde url

156

Tengo una URL de imagen. Quiero mostrar una imagen de esta URL en un ImageView pero no puedo hacerlo.

¿Cómo se puede lograr esto?

Sanat Pandey
fuente
Posible duplicado de ¿Cómo cargar un ImageView por URL en Android?
blahdiblah
mire estas preguntas y concéntrese en las primeras respuestas, aquí puede encontrar dos formas simples y completas de hacer esto: primer método (más completo) o segundo método (más simple)
lory105
puede utilizar Picasso y Glide imagen Cargador y se muestran a imageview
shweta c

Respuestas:

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
fuente
6060
Realmente no deberías usar eso, ya que bloquea el hilo de la interfaz de usuario. Esta biblioteca se encargará de enhebrar y descargar por usted: github.com/koush/UrlImageViewHelper
koush
16
No si ejecutas ese bloque en un hilo separado menos el setImageBitmap
Jonathan
funciona mostrando en miniaturas y haciendo clic en la vista de imagen, utilicé dsplaying dailog pero se abre después de 10 segundos
Prasad
44
@koush: este código estaría bien si se envuelve en un AsyncTask.
Greg Brown
2
Debe realizar cualquier operación de red en un hilo separado. Cuando se ha cargado el mapa de bits, puede usar ImageView.post () o Handler.post ()
Volodymyr Shalashenko
311

La respuesta aceptada arriba es excelente si está cargando la imagen con solo hacer clic en un botón, sin embargo, si lo está haciendo en una nueva actividad, congela la interfaz de usuario por un segundo o dos. Mirando a mi alrededor descubrí que un simple asinctask eliminaba este problema.

Para usar un asinctask para agregar esta clase al final de su actividad:

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

Y llame desde su método onCreate () usando:

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

No olvide agregar el siguiente permiso en su archivo de manifiesto

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

Funciona muy bien para mi. :)

Kyle Clegg
fuente
2
Me gusta esta solución, solo debes limpiar el código de onPostExecute, ya que su cuerpo está fuera.
Sofija
esto es genial. @Sofija, ¿qué quisiste decir con limpieza? ¿Qué pasa si tienes un número desconocido de fotos?
5er
@ 5er Tenía algunos de los corchetes fuera de lugar en la respuesta original. Desde entonces lo he limpiado, así que deberías poder usarlo como está.
Kyle Clegg
Sin olvidar que también debemos agregar permisos en manifiesto: <uses-permission android: name = "android.permission.INTERNET" />
mike20132013
1
Esto es increíble para aprender / piratear (upvoted), pero para cualquier producción, debe usar una biblioteca de Imageloader, hay tantos por ahí. Mi favorito es Universal Image
Loader
31

prueba picasssoagradable y termina en una declaración

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

tutorial: https://youtu.be/DxRqxsEPc2s

vijaicv
fuente
3
Picasso, Glide son mis favoritos, también. La declaración de Glide es bastante similar a Picasso, con muchas mejoras en el tamaño de caché.
anhtuannd
1
Esta debería ser la nueva respuesta, aunque siempre es bueno saber cómo hacerlo por su cuenta. Gran artículo que explica en ambos sentidos: medium.com/@crossphd/…
Martin Jäkel
9

Pruebe esto agregar archivo jar picasso lib

Picasso.with(context)
                .load(ImageURL)
                .resize(width,height).noFade().into(imageView);
Rakesh Rangani
fuente
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();
        }


    }


}

en su actividad tome imageview y configure imageDownload de recursos (url, yourImageview);


fuente
5

UrlImageViewHelper llenará un ImageView con una imagen que se encuentra en una URL. UrlImageViewHelper automáticamente descargará, guardará y almacenará en caché todas las URL de imágenes de BitmapDrawables. Las URL duplicadas no se cargarán en la memoria dos veces. La memoria de mapa de bits se administra mediante una tabla hash de referencia débil, por lo que tan pronto como la imagen ya no sea utilizada por usted, la basura se recolectará automáticamente.

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

https://github.com/koush/UrlImageViewHelper

koush
fuente
4

Basado en esta respuesta, escribo mi propio cargador.

Con efecto de carga y efecto de aparición:

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

Agregar permiso

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

Y ejecutar:

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

Aquí hay un código de muestra para mostrar la imagen desde la 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
fuente
3

El mejor método que he probado en lugar de usar bibliotecas

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
fuente
3

agregar permiso de Internet en manifiesto

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

que crear el método de la siguiente manera,

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

ahora agregue esto en su método onCreate,

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


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

Esto funciona para mí.

Jinal Awaiya
fuente
2

El siguiente código muestra cómo configurar ImageView desde una cadena de URL, usando RxAndroid. Primero, agregue RxAndroid library 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'

}

ahora use setImageFromUrl para establecer la imagen.

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
fuente
2

Hay dos formas:

1) Uso de la biblioteca Glide Esta es la mejor manera de cargar la imagen desde la URL porque cuando intentas mostrar la misma URL por segunda vez, se mostrará desde la captura, así que mejora el rendimiento de la aplicación

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

dependencia: implementation 'com.github.bumptech.glide:glide:4.10.0'


2) Usando Stream. Aquí desea crear un mapa de bits a partir de una imagen url

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

Aqui tienes

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
    }
}
Excepcional
fuente
¿Qué es ivdpfirst?
Big McLargeHuge
Id de ImageView utilizado en el diseño xml.
Excepcional
1

Prueba esto:

InputStream input = contentResolver.openInputStream(httpuri);
Bitmap b = BitmapFactory.decodeStream(input, null, options);
chung
fuente
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
fuente
1

Para mí, Fresco es la mejor entre las otras bibliotecas.

Simplemente configure Fresco y luego simplemente configure la imagenURI de esta manera:

draweeView.setImageURI(uri);

Consulte esta respuesta que explica algunos de los beneficios de Fresco.

Wilder Pereira
fuente