¿Cómo cargar un ImageView por URL en Android? [cerrado]


530

¿Cómo se usa una imagen referenciada por URL en un ImageView?



Respuestas:


713

Del desarrollador de 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);
    }
}

Asegúrese de tener los siguientes permisos establecidos en su AndroidManifest.xmlpara acceder a Internet.

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

39
Esto es asombroso Y debería estar mucho más arriba en la lista. ¡El asinctask permite que esto se cargue sin congelar la interfaz de usuario!
Kyle Clegg

3
AsyncTasks utiliza un ejecutor en serie, lo que significa que cada imagen se cargará de una en una y no cargará hilos paralelos.
Blundell

2
El enlace de origen ya no funciona ...
hecvd

10
La secuencia de entrada no está cerrada en su ejemplo. Mejor hacerlo en el bloque finalmente de su intento / captura.
Risadinha

2
¿Sigue siendo relevante este método? Estoy un poco confundido sobre el método OnClick () y su propósito
tccpg288

170

1. Picasso permite la carga de imágenes sin problemas en su aplicación, ¡a menudo en una línea de código!

Utiliza Gradle:

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

¡Solo una línea de código!

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

2. Glide Una biblioteca de carga y almacenamiento en caché de imágenes para Android centrada en el desplazamiento suave

Utiliza Gradle:

repositories {
  mavenCentral() 
  google()
}

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

// Para una vista simple:

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

3. fresco es un poderoso sistema para mostrar imágenes en aplicaciones de Android . Fresco se encarga de cargar y mostrar imágenes, para que no tenga que hacerlo.

Comenzando con Fresco


2
Entonces, si la url es localhost, significa que la imagen está en la base de datos del servidor local del sistema en desarrollo como xampp, aún así puedo obtener la imagen de la url =.
blackjack

2
@blackjack: localhost de la aplicación sería el teléfono inteligente en sí. Para acceder a su sistema de desarrollo, el teléfono inteligente y su sistema de desarrollo deberán estar en la misma red y deberá usar la dirección IP de su sistema de desarrollo en esa red.
Ridcully

1
¿es posible usar picasso para cargar la imagen en el botón?
Mahdi

1
@chiragkyada lo intento con este código Picasso.with (context) .load (url) .into (button_view); pero se muestra error para: into (button_view)
mahdi

1
Creo que esta debería ser la respuesta aceptada
Udo

150

Tendrás que descargar la imagen primero

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

Luego use Imageview.setImageBitmap para establecer el mapa de bits en ImageView


126
Tienes razón. pero solo estas 3 líneas ayudan a resolver el problema. URL newurl = nueva URL (photo_url_str); mIcon_val = BitmapFactory.decodeStream (newurl.openConnection () .getInputStream ()); profile_photo.setImageBitmap (mIcon_val); gracias por tu respuesta
Praveen

2
Para URL: importe java.net.URL; privado estático final int IO_BUFFER_SIZE = 4 * 1024; ¿Cuál fue el último?
Steve


@SACPK, debe escribir su comentario como respuesta para que pueda ser votado
Jim Wallace

la respuesta fue adecuada para mí ,, publíquelo como respuesta :)
omnia mm

71

Escribí una clase para manejar esto, ya que parece ser una necesidad recurrente en mis diversos proyectos:

https://github.com/koush/UrlImageViewHelper

UrlImageViewHelper llenará un ImageView con una imagen que se encuentra en una URL.

La muestra realizará una Búsqueda de imágenes de Google y cargará / mostrará los resultados de forma asincrónica.

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 utilizando 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.


¿Cuál es la licencia de esto, por cierto?
Ehtesh Choudhury

@Shurane - Apache. Lo anotaré más tarde.
koush

1
Parece que necesitamos usar este en su lugar github.com/koush/ion ya que UrlImageViewHelper ha quedado en desuso como se muestra en la página del proyecto github en github.com/koush/UrlImageViewHelper .
Svetoslav Marinov

69

De todos modos la gente pide mi comentario para publicarlo como respuesta. Estoy publicando

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

esto es corto y genial, gracias
Nactus

18
mm .. sin embargo, esto no se puede hacer desde el hilo de la interfaz de usuario.
Guy

2
Para las personas que tienen problemas con la "Excepción de URL con formato incorrecto", rodee las líneas anteriores en un intento / captura. stackoverflow.com/a/24418607/2093088
Riot Goes Woof

1
Esto debe hacerse usando AsyncTask como se describió anteriormente
B-GangsteR

63

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, se congela la interfaz de usuario por un segundo o dos. Mirando alrededor, descubrí que un simple asinctask eliminaba este problema.

Para usar un asinctask, agregue 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);

El resultado es una actividad cargada rápidamente y una vista de imagen que aparece una fracción de segundo más tarde dependiendo de la velocidad de la red del usuario.


Esto fue rápido y compacto. Satisfizo mis necesidades muy bien! ¡Gracias!
Mark Murphy

a partir de mi marca de tiempo, ¡esto funcionó para mí!
Carpk

25

También puede usar esta vista LoadingImageView para cargar una imagen desde una url:

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

Una vez que haya agregado el archivo de clase desde ese enlace, puede crear una instancia de una vista de imagen de 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"
 />

En codigo:

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

Y actualícelo usando:

image.setImageDrawable("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");

Buena muestra, pero no creo que esto sea seguro para subprocesos. Estoy tratando de usarlo en un Async onPostExecute, sin embargo, el onPostExecute a veces puede finalizar antes de que se reciba la devolución de llamada, lo que genera una imagen nula.
Jimmy

Esto gestiona su propio hilo. Entonces, ¿por qué no hacer que su llamada ASyncTask vuelva a la interfaz de usuario cuando haya terminado, con la URL que desea? De esa manera no tienes hilos que generan hilos.
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;
}
}

Muchas gracias, el ejemplo perfecto que estaba buscando ................, pero bajo un tema incorrecto, esto debería haber estado aquí ==> Cómo configurar una imagen de imageView desde una cadena ?
VenomVendor

10

Hola, tengo el código más fácil, prueba esto

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

prueba esto


10

La mejor biblioteca moderna para tal tarea en mi opinión es Picasso by Square. Permite cargar una imagen a un ImageView por URL con una sola línea:

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

9

Recientemente encontré un hilo aquí , ya que tengo que hacer algo similar para una vista de lista con imágenes, pero el principio es simple, como puedes leer en la primera clase de muestra que se muestra allí (por jleedev). Obtiene la secuencia de entrada de la imagen (de la 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();
}

Luego almacena la imagen como Drawable y puede pasarla a ImageView (a través de setImageDrawable). Nuevamente, desde el fragmento de código superior, eche un vistazo a todo el hilo.

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

No tengo DefaultHttpClient en mi proyecto.
Stepan Yakovenko

8

Mucha información buena aquí ... Recientemente encontré una clase llamada SmartImageView que parece estar funcionando muy bien hasta ahora. Muy fácil de incorporar y usar.

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

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

ACTUALIZACIÓN : Terminé escribiendo una publicación de blog sobre esto , así que échale un vistazo para obtener ayuda sobre el uso de SmartImageView.

2ª ACTUALIZACIÓN : ahora siempre uso Picasso para esto (ver arriba) y lo recomiendo encarecidamente. :)


7

Esta es una respuesta tardía, como se sugirió anteriormente AsyncTask, y después de buscar en Google un poco, encontré una forma más para este problema.

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

imageView.setImageDrawable(drawable);

Aquí está la función completa:

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

No olvide agregar los siguientes permisos en su AndroidManifest.xmlpara acceder a Internet.

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

Lo intenté yo mismo y aún no he tenido ningún problema.


¡Esto es realmente muy bueno para el minimalismo! Solo tenga en cuenta que es necesario ejecutar un extra Threadporque el subproceso de la interfaz de usuario no permite operaciones de red.
creativecreatorormaybenot

6
imageView.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));//try/catch IOException and MalformedURLException outside

5

Esto te ayudara...

Definir imagen vista y cargar imagen en ella .....

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

Luego defina este método:

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

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

4

Versión con manejo de excepciones y tarea asíncrona:

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

Este código está probado, está funcionando completamente.

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

Trabajar para imageView en cualquier contenedor, como vista de cuadrícula de vista de lista, diseño normal

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

+1 gracias por una solución completa y fácil.
PeteH

3

Intente de esta manera, espero que esto lo ayude a resolver su problema.

Aquí explico acerca de cómo usar la biblioteca externa "AndroidQuery" para cargar imágenes desde url / server de manera asíncrona con también imágenes cargadas en caché al archivo del dispositivo o área de caché.

  • Descargue la biblioteca "AndroidQuery" desde aquí
  • Copie / pegue este jar en la carpeta lib del proyecto y agregue esta biblioteca a la ruta de compilación del proyecto
  • Ahora muestro demostración de cómo usarlo.

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

Android Query puede manejar eso por usted y mucho más (como el caché y el progreso de carga).

Echa un vistazo aquí .

Creo que es el mejor enfoque.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.