Carregar imagem do URL

156

Eu tenho um URL de imagem. Quero exibir uma imagem deste URL em um ImageView, mas não consigo fazer isso.

Como isso pode ser alcançado?

Sanat Pandey
fonte
Possível duplicata de Como carregar um ImageView por URL no Android?
precisa saber é o seguinte
olhar estas perguntas e foco nas primeiras respostas, aqui você pode encontrar duas maneiras simples e completas de fazer isso: primeiro método (mais completo) ou segundo método (mais simples)
lory105
você pode usar Picasso e Glide carregador de imagem e exibido para ImageView
shweta c

Respostas:

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
fonte
60
Você realmente não deve usar isso, pois bloqueia o thread da interface do usuário. Esta biblioteca tratará de threading e download para você: github.com/koush/UrlImageViewHelper
koush
16
Não se u executar esse bloco em um segmento separado menos o setImageBitmap
Jonathan
seu trabalho eu exibindo em miniaturas e onclick imageview eu usei dsplaying dailog, mas ele abre depois de 10 segundos
Prasad
4
@koush - Este código seria bom se envolto em um AsyncTask.
Greg Brown
2
Você deve fazer quaisquer operações networl em um segmento separado, Quando bitmap tenha sido carregado, você poderia usar ImageView.post () ou Handler.post ()
Volodymyr Shalashenko
311

A resposta aceita acima é ótima se você estiver carregando a imagem com base em um clique no botão; no entanto, se você estiver fazendo isso em uma nova atividade, ela congelará a interface do usuário por um segundo ou dois. Olhando em volta, descobri que uma simples assíncrona eliminava esse problema.

Para usar uma asynctask para adicionar esta classe ao final de sua atividade:

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

E chame a partir do seu método onCreate () usando:

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

Não se esqueça de adicionar abaixo a permissão no seu arquivo de manifesto

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

Funciona muito bem para mim. :)

Kyle Clegg
fonte
2
Eu gosto dessa solução, você deve apenas limpar o código do onPostExecute, pois o corpo está fora.
Sofija
isso é ótimo. @Sofija, o que você quis dizer com limpeza? e se você tiver um número desconhecido de fotos?
5er
@ 5er Eu tinha alguns dos suportes fora do lugar na resposta original. Desde então, limpei-o para que você possa usá-lo como está.
precisa
Para não esquecer que também precisamos adicionar permissão no manifesto: <uses-permission android: name = "android.permission.INTERNET" />
mike20132013
1
Isso é incrível para aprender / invadir (votado), mas para qualquer produção, você deve usar uma biblioteca do Imageloader, existem tantas por aí. Meu favorito é Universal carregador de Imagem, Picasso etc.
AmeyaB
31

tente picasssoagradável e termina em uma declaração

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

tutorial: https://youtu.be/DxRqxsEPc2s

vijaicv
fonte
3
Picasso, Glide também são meus favoritos. A declaração do Glide é bastante semelhante ao Picasso, com muitas melhorias no tamanho do cache.
anhtuannd 8/16
1
Essa deve ser a nova resposta, embora seja sempre bom saber fazer isso sozinho. Ótimo artigo explicando as duas maneiras: medium.com/@crossphd/…
Martin Jäkel
9

Experimente este arquivo adicionar jar picasso lib jar

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


    }


}

em sua atividade, assista ao imageview e defina o recurso imageDownload (url, yourImageview);


fonte
5

UrlImageViewHelper preencherá um ImageView com uma imagem encontrada em um URL. O UrlImageViewHelper fará o download, salvará e armazenará em cache automaticamente todos os URLs da imagem do BitmapDrawables. Os URLs duplicados não serão carregados na memória duas vezes. A memória de bitmap é gerenciada usando uma tabela de hash de referência fraca; assim que a imagem não for mais usada por você, ela será coletada automaticamente.

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

https://github.com/koush/UrlImageViewHelper

koush
fonte
4

Com base nesta resposta, escrevo meu próprio carregador.

Com efeito de carregamento e efeito de aparência:

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

Adicionar permissão

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

E execute:

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

Aqui está um código de exemplo para exibir a imagem do 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
fonte
3

Melhor método que tentei, em vez 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
fonte
3

adicionar permissão da Internet no manifesto

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

do que criar o método como abaixo,

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

agora adicione isso no seu 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"));

isso funciona para mim.

Jinal Awaiya
fonte
2

O código abaixo mostra como definir o ImageView a partir de uma string de URL, usando o RxAndroid. Primeiro, adicione a 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'

}

agora use setImageFromUrl para definir a imagem.

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

Há duas maneiras:

1) Usando a biblioteca Glide Essa é a melhor maneira de carregar imagem de URL, porque quando você tenta exibir o mesmo URL na segunda vez, ele será exibido da captura, melhorando o desempenho do aplicativo

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

dependência: implementation 'com.github.bumptech.glide:glide:4.10.0'


2) Usando Stream. Aqui você deseja criar bitmap a partir da imagem da URL

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

Aqui está

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
fonte
O que é ivdpfirst?
Big McLargeHuge 27/09/19
ID do ImageView usado no design xml.
Excepcional
1

Tente o seguinte:

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

Para mim, Fresco é o melhor entre as outras bibliotecas.

Basta configurar o Fresco e simplesmente definir o imageURI da seguinte maneira:

draweeView.setImageURI(uri);

Confira esta resposta explicando alguns dos benefícios do Fresco.

Wilder Pereira
fonte