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


530

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



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

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


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


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


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


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

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.


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

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

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


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

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

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. :)


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.


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

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

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

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

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

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

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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.