2011-04-25 48 views
117

Tengo una imagen URL. Quiero mostrar una imagen de esta URL en un ImageView, pero no puedo hacer eso.Cargar imagen de la url

¿Cómo se puede lograr esto?

+0

¿Posible duplicado de [Cómo cargar un ImageView por URL en Android?] (Http://stackoverflow.com/questions/2471935/how-to-load-an-imageview-by-url-in-android) – blahdiblah

+0

puede usar el cargador de imágenes Picasso y Glide y mostrarse en la vista de imagen –

Respuesta

191
URL url = new URL("http://image10.bizrate-images.com/resize?sq=60&uid=2216744464"); 
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 
imageView.setImageBitmap(bmp); 
+52

. Realmente no debe usar eso, ya que bloquea el hilo de la interfaz de usuario. Esta biblioteca se encargará de rosca y carga para usted: https://github.com/koush/UrlImageViewHelper – koush

+12

No si u ejecutar ese bloque en un hilo separado, menos el setImageBitmap – jonney

+0

¿Es este trabajo medthod cuando la imagen se .png ? – UmAnusorn

6
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 tomar imageview & recurso conjunto imageDownload (url, yourImageview);

3

prueba este

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

       } 

      } 
      catch(IOException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
268

La respuesta aceptada arriba es grande si va a cargar la imagen en base a un clic de botón, sin embargo, si usted lo está haciendo en una nueva actividad que se congela la interfaz de usuario por un segundo o dos. Al mirar a mi alrededor, descubrí que una simple asynctask eliminaba este problema.

Para utilizar un AsyncTask añadir 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 llamar desde su método onCreate() usando:

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

No se olvide de añadir a continuación el permiso de el archivo de manifiesto

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

funciona muy bien para mí. :)

+1

Me gusta esta solución, solo debe limpiar el código para onPostExecute, ya que su cuerpo es fuera. – Sofija

+5

Sí, en ASYNC es crucial. – jasonflaherty

+0

esto es genial. @Sofija, ¿qué quisiste decir con la limpieza? ¿y si tienes una cantidad desconocida de fotos? – 5er

4

UrlImageViewHelper se llena un ImageView con una imagen que se encuentra en una URL. 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 mapa de bits 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.

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

https://github.com/koush/UrlImageViewHelper

0
loadImage("http://relinjose.com/directory/filename.png"); 

Aquí tiene

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

Prueba esto:

InputStream input = contentResolver.openInputStream(httpuri); 
Bitmap b = BitmapFactory.decodeStream(input, null, options); 
6

probar este añadir archivo jar Picasso lib

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

Basado en this answer escribo mi propio cargador.

Con Cargando efecto, aparezcan efectos:

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

Añadir permiso

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

y ejecutar:

new DownloadImageTask(context, imageViewToLoad, urlToImage).execute(); 
+1

Gracias! Gran clase;) –

16

tratar picassso agradable y acabados en una declaración

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

tutorial: https://youtu.be/DxRqxsEPc2s

+1

Picasso, Glide son mis favoritos, también. La declaración de Glide es bastante similar a Picasso, con una gran mejora en el tamaño de la memoria caché. – anhtuannd

2

mejor método que han intentado en lugar de utilizar las 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; 
    } 
} 
0

Para mí, Fresco es el mejor entre los demás bibliotecas.

Sólo setup Fresco y luego simplemente configurar el imageURI así:

draweeView.setImageURI(uri); 

Salida this respuesta que explica algunos de los beneficios del fresco.

1

El siguiente código le muestra cómo configurar ImageView desde una cadena de url, usando RxAndroid. En primer lugar, añadir la biblioteca 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' 

} 

ahora usan setImageFromUrl para fijar 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); 
      } 
     }); 
} 
1

añadir permisos de Internet en el manifiesto

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

de crear méthode como abajo,

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

añadir ahora esta 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 es obras para mi.

Cuestiones relacionadas