Come caricare un ImageView per URL in Android? [chiuso]


530

Come si usa un'immagine a cui fa riferimento l'URL in un ImageView?



Risposte:


713

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

Assicurati di avere le seguenti autorizzazioni impostate AndroidManifest.xmlper accedere a Internet.

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

39
Questo è bellissimo. E dovrebbe essere molto più in alto nell'elenco. L'asynctask consente di caricare questo senza congelare l'interfaccia utente!
Kyle Clegg,

3
AsyncTasks utilizza un esecutore seriale, il che significa che ogni immagine verrà caricata una alla volta e non eseguirà il caricamento del thread parallelo.
Blundell,

2
Il collegamento alla fonte non funziona più ...
hecvd,

10
Il flusso di input non è chiuso nel tuo esempio. È meglio farlo nel blocco di fine del tuo try / catch.
Risadinha,

2
Questo metodo è ancora rilevante? Sono un po 'confuso riguardo al metodo OnClick () e al suo scopo
tccpg288,

170

1. Picasso consente il caricamento delle immagini senza problemi nell'applicazione, spesso in una riga di codice!

Usa Gradle:

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

Solo una riga di codice!

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

2. Glide Una libreria di caricamento delle immagini e memorizzazione nella cache per Android incentrata sullo scorrimento regolare

Usa Gradle:

repositories {
  mavenCentral() 
  google()
}

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

// Per una vista semplice:

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

3. fresco è un potente sistema per la visualizzazione di immagini in applicazioni Android. Fresco si occupa del caricamento e della visualizzazione delle immagini, quindi non è necessario.

Introduzione a Fresco


2
Quindi, se l'URL è localhost, significa che l'immagine si trova nel database del server locale del sistema in via di sviluppo come xampp, è comunque in grado di ottenere l'immagine dall'url =.
Blackjack,

2
@blackjack - localhost dall'app sarebbe lo stesso smartphone. Per accedere al tuo sistema di sviluppo, lo smartphone e il tuo sistema di sviluppo dovranno essere nella stessa rete e dovresti utilizzare l'indirizzo IP del tuo sistema di sviluppo in quella rete.
Ridcully,

1
è possibile utilizzare Picasso per caricare l'immagine sul pulsante?
Mahdi,

1
@chiragkyada provo con questo codice Picasso.with (context) .load (url) .into (button_view); ma mostra l'errore per: into (button_view)
mahdi

1
Penso che questa dovrebbe essere la risposta accettata
Udo il

150

Dovrai prima scaricare l'immagine

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

Quindi utilizzare Imageview.setImageBitmap per impostare bitmap in ImageView


126
hai ragione. ma solo queste 3 righe aiutano a risolvere il problema. URL newurl = nuovo URL (photo_url_str); mIcon_val = BitmapFactory.decodeStream (newurl.openConnection () .getInputStream ()); profile_photo.setImageBitmap (mIcon_val); grazie per la tua risposta.
Praveen,

2
Per URL: import java.net.URL; finale statico privato int IO_BUFFER_SIZE = 4 * 1024; qual è stato l'ultimo?
Steve


@SACPK dovresti scrivere il tuo commento come una risposta in modo che possa essere votato
Jim Wallace

la risposta era giusta per me, pubblicala come risposta :)
omnia Mm

71

Ho scritto un corso per gestirlo, in quanto sembra essere un'esigenza ricorrente nei miei vari progetti:

https://github.com/koush/UrlImageViewHelper

UrlImageViewHelper riempirà un ImageView con un'immagine che si trova in un URL.

L'esempio eseguirà una ricerca di immagini di Google e caricherà / mostrerà i risultati in modo asincrono.

UrlImageViewHelper scaricherà, salverà e memorizzerà nella cache automaticamente tutti gli URL dell'immagine BitmapDrawables. Gli URL duplicati non verranno caricati due volte in memoria. La memoria bitmap viene gestita utilizzando una tabella hash di riferimento debole, quindi non appena l'immagine non verrà più utilizzata da te, verrà automaticamente raccolta automaticamente.


A proposito, qual è la licenza?
Ehtesh Choudhury,

@Shurane - Apache. Ne prenderò nota più tardi.
Koush,

1
Sembra che dobbiamo usare questo invece github.com/koush/ion poiché UrlImageViewHelper è stato deprecato come mostrato nella pagina del progetto github su github.com/koush/UrlImageViewHelper .
Svetoslav Marinov,

69

Comunque le persone chiedono il mio commento per pubblicarlo come risposta. sto postando.

URL newurl = new URL(photo_url_str); 
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);

questo è breve e fantastico, grazie
Nactus

18
mm .. questo non può essere fatto dal thread dell'interfaccia utente però.
Guy,

2
Per le persone che hanno problemi con "Esclusione URL non valida", racchiudi le linee sopra in un tentativo / cattura. stackoverflow.com/a/24418607/2093088
Riot Goof Woof il

1
Questo dovrebbe essere fatto usando AsyncTask come descritto sopra
B-GangsteR

63

La risposta accettata sopra è ottima se stai caricando l'immagine sulla base di un clic sul pulsante, tuttavia se lo stai facendo in una nuova attività, blocca l'interfaccia utente per un secondo o due. Guardandomi intorno ho scoperto che un semplice asincrono ha eliminato questo problema.

Per usare un asincrono aggiungi questa classe alla fine della tua attività:

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 chiama dal tuo metodo onCreate () usando:

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

Il risultato è un'attività caricata rapidamente e una visualizzazione dell'immagine che viene visualizzata in una frazione di secondo in seguito a seconda della velocità della rete dell'utente.


Questo è stato veloce e compatto. Ho soddisfatto bene le mie esigenze! Grazie!
Mark Murphy,

dal mio timestamp, questo ha funzionato per me!
Carpk,

25

Puoi anche utilizzare questa visualizzazione LoadingImageView per caricare un'immagine da un URL:

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

Dopo aver aggiunto il file di classe da quel link è possibile creare un'istanza di una vista immagine URL:

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

Nel codice:

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

E aggiornalo usando:

image.setImageDrawable("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");

Bel campione, ma non credo che sia sicuro per i thread. Sto provando a usarlo in un Async onPostExecute, tuttavia a volte OnPostExecute può terminare prima che il callback venga ricevuto rendendo un'immagine nulla.
Jimmy,

Questo gestisce il proprio thread. Quindi perché non fare in modo che ASyncTask richiami all'interfaccia utente al termine, con l'URL desiderato. In questo modo non hai thread che generano thread.
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;
}
}

Grazie mille, l'esempio perfetto che stavo cercando ................, ma sotto Argomento sbagliato questo dovrebbe essere stato qui ==> Come impostare l'immagine di ImageView da una stringa ?
VenomVendor

10

Ciao ho il codice più semplice provare questo

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

prova questo


10

La migliore biblioteca moderna per tale compito secondo me è Picasso di Square. Permette di caricare un'immagine su ImageView tramite URL con una riga:

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

9

Di recente ho trovato un thread qui , poiché devo fare una cosa simile per una visualizzazione elenco con immagini, ma il principio è semplice, come puoi leggere nella prima classe di esempio mostrata lì (da jleedev). Ottieni il flusso di input dell'immagine (dal 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();
}

Quindi memorizzi l'immagine come Drawable e puoi passarla a ImageView (tramite setImageDrawable). Sempre dallo snippet di codice superiore, dai un'occhiata all'intero thread.

InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");

Non ho DefaultHttpClient nel mio progetto.
Stepan Yakovenko,

8

Un sacco di buone informazioni qui ... Di recente ho trovato una classe chiamata SmartImageView che sembra funzionare molto bene finora. Molto facile da incorporare e utilizzare.

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

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

AGGIORNAMENTO : Ho finito per scrivere un post sul blog su questo , quindi dai un'occhiata per aiuto sull'uso di SmartImageView.

2 ° AGGIORNAMENTO : ora uso sempre Picasso per questo (vedi sopra) e lo consiglio vivamente. :)


7

Questa è una risposta tardiva, come suggerito sopra AsyncTasksarà e dopo aver cercato su Google un po 'ho trovato un altro modo per questo problema.

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

imageView.setImageDrawable(drawable);

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

Non dimenticare di aggiungere le seguenti autorizzazioni AndroidManifest.xmlper accedere a Internet.

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

Ho provato questo da solo e non ho ancora riscontrato alcun problema.


Questo è in realtà molto bello per il minimalismo! Tieni presente che è necessario eseguire un extra Threadperché il thread dell'interfaccia utente non consente le operazioni di rete.
creativecreatorormaybenot

6
imageView.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));//try/catch IOException and MalformedURLException outside

5

Questo ti aiuterà ...

Definisci imageview e carica l'immagine in esso .....

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

Quindi definire questo metodo:

    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

Versione con gestione delle eccezioni e attività asincrona:

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

Questo codice è testato, funziona 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

Funziona con imageView in qualsiasi contenitore, come la visualizzazione a griglia di visualizzazione elenco, layout normale

 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 grazie per la soluzione completa e semplice.
PeteH,

3

Prova in questo modo, spero che questo ti aiuti a risolvere il tuo problema.

Qui spiego come utilizzare la libreria esterna "AndroidQuery" per caricare l'immagine da url / server in modo asincrono con anche l'immagine caricata nella cache nel file del dispositivo o nell'area cache.

  • Scarica la libreria "AndroidQuery" da qui
  • Copia / incolla questo jar per proiettare la cartella lib e aggiungi questa libreria al project build-path
  • Ora mostro demo su come usarlo.

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

Android Query può gestirlo per te e molto altro (come cache e avanzamento del caricamento).

Dai un'occhiata qui .

Penso che sia l'approccio migliore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.