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

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

Del desarrollador de Android :

 // show The Image in a ImageView new DownloadImageTask((ImageView) findViewById(R.id.imageView1)) .execute("http://sofes.miximages.com/android/android_icon_256.png"); public void onClick(View v) { startActivity(new Intent(this, IndexActivity.class)); finish(); } private class DownloadImageTask extends AsyncTask { 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.xml para acceder a Internet.

  

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

A continuación, utilice Imageview.setImageBitmap para establecer el bitmap en ImageView

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

Usa Gradle:

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

¡Solo una línea de código!

 Picasso.get().load("http://sofes.miximages.com/android/DvpvklR.jpg").into(imageView); 

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

Usa 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://sofes.miximages.com/android/DvpvklR.jpg").into(imageView); 

3. fresco es un poderoso sistema para mostrar imágenes en aplicaciones de Android . Fresco se encarga de la carga y visualización de la imagen, por lo que no es necesario.

Comenzando con Fresco

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 asíncrona.

UrlImageViewHelper automáticamente descargará, guardará y almacenará en caché todas las URL de imagen de BitmapDrawables. Las URL duplicadas no se cargarán en la memoria dos veces. La memoria de bitmap se gestiona utilizando una tabla hash de referencia débil, por lo que tan pronto como la imagen ya no la utilice, se recolectará la basura automáticamente.

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

Gracias.

La respuesta aceptada anterior es excelente si está cargando la imagen en función de un clic de botón, sin embargo, si lo hace en una nueva actividad, congelará la IU durante uno o dos segundos. Al mirar a mi alrededor, descubrí que una simple asynctask eliminaba este problema.

Para usar una asynctask agregue esta clase al final de su actividad:

 private class DownloadImageTask extends AsyncTask { 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 la imagen que aparece una fracción de segundo más tarde dependiendo de la velocidad de la red del usuario.

También puede usar esta vista de 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 url:

en xml:

  

En codigo:

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

Y actualizarlo usando:

 image.setImageDrawable("http://sofes.miximages.com/android/android_icon_256.png"); 
 public class LoadWebImg extends Activity { String image_URL= "http://sofes.miximages.com/android/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; } } 

Hola, tengo el código más fácil, intente 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://sofes.miximages.com/android/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

    

prueba esto

Recientemente he encontrado un hilo aquí , ya que tengo que hacer algo similar para una vista de lista con imágenes, pero el principio es simple, como se puede leer en la primera clase de muestra que se muestra allí (por jleedev). Obtienes la transmisión de entrada de la imagen (desde 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"); 

Mucha información buena aquí … Hace poco 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.

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

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

 Picasso.with(context).load("http://sofes.miximages.com/android/DvpvklR.jpg").into(imageView); 
 imageView.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));//try/catch IOException and MalformedURLException outside 

Esta es una respuesta tardía, como se sugirió anteriormente, AsyncTask lo hará y después de googlear un poco encontré una forma más de resolver 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.xml para acceder a Internet.

Intenté esto yo mismo y todavía no me he enfrentado a ningún problema.

Esto te ayudara…

Defina la vista de la imagen y cargue la 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; } 
  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; } 

Una forma simple y limpia de hacer esto es usar la biblioteca de código abierto Prime .

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

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

 URL req = new URL( "http://sofes.miximages.com/android/android_icon_256.png" ); Bitmap mIcon_val = BitmapFactory.decodeStream(req.openConnection() .getInputStream()); 

Trabajando para imageView en cualquier contenedor, como vista de cuadrícula 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 ); 

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

 AsyncTask asyncTask = new AsyncTask() { 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(); } 

Intenta de esta manera, espero que esto te ayude a resolver tu problema.

Aquí explico cómo usar la biblioteca externa “AndroidQuery” para cargar imágenes desde url / server en modo asyncTask con la imagen cargada en caché en el archivo del dispositivo o en el área de la memoria caché.

  • Descargue la biblioteca “AndroidQuery” desde aquí
  • Copie / Pegue este archivo jar para proyectar la carpeta lib y agregue esta biblioteca al proyecto build-path
  • Ahora muestro una demostración de cómo usarla.

activity_main.xml

       

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://sofes.miximages.com/android/mjbrender",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. 

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

Eche un vistazo aquí .

Creo que es el mejor enfoque.