Como carregar um ImageView por URL no Android? [fechadas]

530

Como você usa uma imagem referenciada pelo URL em um ImageView?

Praveen
fonte
1
experimentar este stackoverflow.com/questions/14332296/...
comeGetSome
2
Use Picasso ... stackoverflow.com/a/23865531/3535286
chiragkyada

Respostas:

713

Do desenvolvedor do 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);
    }
}

Verifique se você possui as seguintes permissões definidas AndroidManifest.xmlpara acessar a Internet.

<uses-permission android:name="android.permission.INTERNET" />
Desenvolvedor Android
fonte
39
Isso é incrível. E deve ser muito mais alto na lista. O asynctask permite que isso seja carregado sem congelar a interface do usuário!
Kry Clegg
3
O AsyncTasks usa um executor serial, o que significa que cada imagem será carregada uma de cada vez e não fará o carregamento paralelo de threads.
Blundell
2
Link da fonte não funciona mais ...
hecvd
10
O fluxo de entrada não está fechado no seu exemplo. Melhor feito no bloco finalmente de sua tentativa / captura.
Risadinha
2
Este método ainda é relevante? Estou um pouco confuso sobre o método OnClick () e sua finalidade
tccpg288
170

1. O Picasso permite o carregamento de imagens sem problemas no seu aplicativo - geralmente em uma linha de código!

Use Gradle:

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

Apenas uma linha de código!

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

2. Planar Uma biblioteca de carregamento e armazenamento de imagens para Android focada em rolagem suave

Use Gradle:

repositories {
  mavenCentral() 
  google()
}

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

// Para uma visão simples:

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

3. fresco é um sistema poderoso para a exibição de imagens em aplicativos Android . O Fresco cuida do carregamento e exibição da imagem, para que você não precise.

Introdução ao Fresco

chiragkyada
fonte
2
Portanto, se o URL for localhost, significa que a imagem está no banco de dados do servidor local do sistema em desenvolvimento, como xampp, ainda assim é possível obter a imagem do URL =.
blackjack
2
@blackjack - o host local do aplicativo seria o próprio smartphone. Para acessar seu sistema em desenvolvimento, o smartphone e seu sistema em desenvolvimento deverão estar na mesma rede e você precisará usar o endereço IP do seu sistema em desenvolvimento nessa rede.
Ridcully
1
é possível usar o picasso para carregar a imagem no botão?
mahdi
1
@chiragkyada eu tento com esse código Picasso.with (context) .load (url) .into (button_view); mas é mostrar erro para: into (button_view)
mahdi
1
Eu acho que isso deve ser a resposta aceita
Udo
150

Você terá que baixar a imagem primeiro

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

Em seguida, use o Imageview.setImageBitmap para definir o bitmap no ImageView

Steve
fonte
126
você está certo. mas apenas essas três linhas ajudam a resolver o problema. URL newurl = nova URL (photo_url_str); mIcon_val = BitmapFactory.decodeStream (newurl.openConnection () .getInputStream ()); profile_photo.setImageBitmap (mIcon_val); obrigado pela sua resposta.
Praveen
2
Para URL - import java.net.URL; final estático privado int IO_BUFFER_SIZE = 4 * 1024; qual foi o ultimo
19410 Steve Steve
12
Veja o código aqui: stackoverflow.com/questions/3118691/…
OneWorld
@SPACK, você deve escrever seu comentário como resposta, para que possa ser votado com #
Jim Wallace
a resposta era certo para mim ,, postá-lo como uma resposta :)
omnia Mm
71

Eu escrevi uma classe para lidar com isso, pois parece ser uma necessidade recorrente em meus vários projetos:

https://github.com/koush/UrlImageViewHelper

UrlImageViewHelper preencherá um ImageView com uma imagem encontrada em um URL.

A amostra fará uma Pesquisa de imagens do Google e carregará / exibirá os resultados de forma assíncrona.

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.

koush
fonte
Qual é a licença sobre isso, a propósito?
Ehtesh Choudhury
@Shurane - Apache. Vou anotar isso mais tarde.
koush
1
Parece que precisamos usar este em vez de github.com/koush/ion, pois o UrlImageViewHelper foi descontinuado, conforme mostrado na página do projeto github em github.com/koush/UrlImageViewHelper .
Svetoslav Marinov
69

Enfim, as pessoas pedem meu comentário para publicá-lo como resposta. estou postando.

URL newurl = new URL(photo_url_str); 
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);
Praveen
fonte
isso é curto e ótimo, obrigado
#:
18
mm .. isso não pode ser feito a partir da thread da interface do usuário.
Guy
2
Para pessoas com problemas com "Exceção de URL malformada", coloque as linhas acima em uma tentativa / captura. stackoverflow.com/a/24418607/2093088
Riot Goes Woof
1
Isto deve ser feito usando AsyncTask como descrito acima
B-GaNgStEr
63

A resposta aceita acima é ótima se você estiver carregando a imagem com base em um clique no botão; no entanto, se 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 um asynctask, adicione esta classe no 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);

O resultado é uma atividade carregada rapidamente e uma visualização de imagem que aparece uma fração de segundo depois, dependendo da velocidade da rede do usuário.

Kyle Clegg
fonte
Isso foi rápido e compacto. Atendeu bem minhas necessidades! Obrigado!
Mark Murphy
no meu horário, funcionou para mim!
Carpk
25

Você também pode usar esta exibição LoadingImageView para carregar uma imagem de um URL:

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

Depois de adicionar o arquivo de classe a partir desse link, você pode instanciar uma visualização de imagem de URL:

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

Em código:

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

E atualize-o usando:

image.setImageDrawable("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");
Blundell
fonte
Bela amostra, mas não acredito que isso seja seguro para threads. Estou tentando usá-lo em um Async onPostExecute, no entanto, o onPostExecute às vezes pode terminar antes que o retorno de chamada seja recebido, renderizando uma imagem nula.
Jimmy
Isso gerencia seu próprio segmento. Então, por que não chamar sua ASyncTask de volta para a interface do usuário quando ela terminar, com o URL que você deseja. Dessa forma, você não tem tópicos que geram tópicos.
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;
}
}
pragna
fonte
Muito obrigado, o exemplo perfeito que eu estava procurando ................, mas no tópico errado, isso deveria estar aqui ==> Como definir a imagem de um imageView a partir de uma string ?
VenomVendor
10

Oi, eu tenho o código mais fácil, tente isso

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

tente isso

Abhishek Karande
fonte
10

A melhor biblioteca moderna para essa tarefa, na minha opinião, é Picasso by Square. Permite carregar uma imagem em um ImageView por URL com uma linha:

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

Eu encontrei recentemente um tópico aqui , pois tenho que fazer algo semelhante para uma lista de exibição com imagens, mas o princípio é simples, como você pode ler na primeira classe de exemplo mostrada lá (por jleedev). Você obtém o fluxo de entrada da imagem (da 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();
}

Em seguida, você armazena a imagem como Drawable e pode transmiti-la ao ImageView (via setImageDrawable). Novamente, no snippet de código superior, dê uma olhada em todo o thread.

InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
Djumaka
fonte
Não tenho DefaultHttpClient no meu projeto.
Stepan Yakovenko 28/11
8

Muitas informações boas aqui ... Encontrei recentemente uma classe chamada SmartImageView que parece estar funcionando muito bem até agora. Muito fácil de incorporar e usar.

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

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

ATUALIZAÇÃO : Acabei escrevendo uma postagem de blog sobre isso , então confira para obter ajuda sobre o uso do SmartImageView.

2ª ATUALIZAÇÃO : Agora sempre uso o Picasso para isso (veja acima) e recomendo. :)

Ben Jakuben
fonte
7

Esta é uma resposta tardia, conforme sugerido acima AsyncTaske, depois de pesquisar um pouco, encontrei mais uma maneira para esse problema.

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

imageView.setImageDrawable(drawable);

Aqui está a função 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();
}

Não se esqueça de adicionar as seguintes permissões no seu AndroidManifest.xmlpara acessar a Internet.

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

Eu tentei isso sozinho e ainda não enfrentei nenhum problema.

IgniteCoders
fonte
Isso é realmente muito bom para o minimalismo! Lembre-se de que é necessário executar um extra Threadporque o encadeamento da interface do usuário não permite operações de rede.
Creativecreatorormaybenot
6
imageView.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));//try/catch IOException and MalformedURLException outside
yingted
fonte
5

Isso irá ajudá-lo ...

Definir visualização de imagem e carregar imagem nela .....

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

Em seguida, 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;
}
Mitul Goti
fonte
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);
Srinivas Kattimani
fonte
4

Versão com manipulação de exceção e tarefa assí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();
}
MatheusJardimB
fonte
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;
    } 
SoH
fonte
3

Uma maneira simples e limpa de fazer isso é usar a biblioteca de código aberto Prime .

HandlerExploit
fonte
3

Este código foi testado, 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());
MONICA
fonte
3

Trabalhando para o imageView em qualquer contêiner, como exibição em grade de listview, layout 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 );
Vinayak
fonte
+1 obrigado pela solução fácil e completa.
Peteh
3

Tente dessa maneira, espero que isso ajude você a resolver seu problema.

Aqui, explico como usar a biblioteca externa "AndroidQuery" para carregar a imagem do URL / servidor da maneira asyncTask, com também a imagem carregada em cache no arquivo do dispositivo ou na área de cache.

  • Faça o download da biblioteca "AndroidQuery" a partir daqui
  • Copie / cole este jar na pasta lib do projeto e adicione esta biblioteca ao caminho de construção do projeto
  • Agora eu mostro uma demonstração de como usá-lo.

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.
Haresh Chhelana
fonte
3

O Android Query pode lidar com isso para você e muito mais (como cache e progresso do carregamento).

Dê uma olhada aqui .

Eu acho que é a melhor abordagem.

Bruno Krebs
fonte