Bagaimana cara memuat ImageView oleh URL di Android? [Tutup]

530

Bagaimana Anda menggunakan gambar yang dirujuk oleh URL dalam ImageView?

Praveen
sumber
1
coba yang ini stackoverflow.com/questions/14332296/…
comeGetSome
2
Gunakan Picasso ... stackoverflow.com/a/23865531/3535286
chiragkyada

Jawaban:

713

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

Pastikan Anda memiliki izin berikut yang ditetapkan AndroidManifest.xmluntuk mengakses internet.

<uses-permission android:name="android.permission.INTERNET" />
Pengembang Android
sumber
39
Ini luar biasa. Dan harus jauh lebih tinggi dalam daftar. Asynctask memungkinkan ini untuk memuat tanpa membekukan UI!
Kyle Clegg
3
AsyncTasks menggunakan pelaksana serial, artinya setiap gambar akan memuat satu per satu dan tidak melakukan pemuatan thread paralel.
Blundell
2
Tautan sumber tidak berfungsi lagi ...
hecvd
10
Aliran input tidak tertutup dalam contoh Anda. Paling baik dilakukan di blok terakhir dari percobaan / tangkapan Anda.
Risadinha
2
Apakah metode ini masih relevan? Saya agak bingung tentang metode OnClick () dan tujuannya
tccpg288
170

1. Picasso memungkinkan pemuatan gambar tanpa repot di aplikasi Anda — sering kali dalam satu baris kode!

Gunakan Gradle:

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

Hanya satu baris kode!

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

2. Glide Perpustakaan pemuatan dan penyimpanan gambar untuk Android yang berfokus pada pengguliran yang lancar

Gunakan Gradle:

repositories {
  mavenCentral() 
  google()
}

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

// Untuk tampilan sederhana:

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

3. fresco adalah sistem yang kuat untuk menampilkan gambar di aplikasi Android. Frco menangani pemuatan dan tampilan gambar, jadi Anda tidak perlu melakukannya.

Memulai dengan Fresco

chiragkyada
sumber
2
Jadi jika url adalah localhost, berarti gambar berada dalam sistem database server lokal seperti xampp, masih bisa mendapatkan gambar dari url =.
blackjack
2
@blackjack - localhost dari aplikasi adalah smartphone itu sendiri. Untuk mengakses sistem pengembangan Anda, telepon pintar dan sistem pengembangan Anda harus berada di jaringan yang sama dan Anda harus menggunakan alamat IP sistem pengembangan Anda di jaringan itu.
Ridcully
1
apakah mungkin menggunakan picasso untuk memuat gambar pada tombol?
mahdi
1
@chiragkyada saya coba dengan kode ini Picasso.with (konteks) .load (url) .into (button_view); tapi itu menunjukkan kesalahan untuk: into (button_view)
mahdi
1
Saya pikir ini harus menjadi jawaban yang diterima
Udo
150

Anda harus mengunduh gambar terlebih dahulu

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

Kemudian gunakan Imageview.setImageBitmap untuk mengatur bitmap ke dalam ImageView

Steve
sumber
126
kamu benar. tetapi hanya 3 baris ini membantu untuk menyelesaikan masalah. URL newurl = URL baru (photo_url_str); mIcon_val = BitmapFactory.decodeStream (newurl.openConnection () .getInputStream ()); profile_photo.setImageBitmap (mIcon_val); terima kasih atas balasan Anda.
Praveen
2
Untuk URL - impor java.net.URL; IO_BUFFER_SIZE int akhir statis pribadi = 4 * 1024; apa yang terakhir?
Steve
12
Lihat kode di sini: stackoverflow.com/questions/3118691/…
OneWorld
@SACPK Anda harus menulis komentar Anda sebagai jawaban sehingga dapat dipilih
Jim Wallace
jawabannya tepat buat saya ,, posting sebagai jawaban :)
omnia Mm
71

Saya menulis sebuah kelas untuk menangani hal ini, karena tampaknya menjadi kebutuhan berulang dalam berbagai proyek saya:

https://github.com/koush/UrlImageViewHelper

UrlImageViewHelper akan mengisi ImageView dengan gambar yang ditemukan di URL.

Sampel akan melakukan Pencarian Gambar Google dan memuat / menampilkan hasilnya secara tidak sinkron.

UrlImageViewHelper akan secara otomatis mengunduh, menyimpan, dan men-cache semua url gambar BitmapDrawables. URL duplikat tidak akan dimuat ke memori dua kali. Memori bitmap dikelola dengan menggunakan tabel hash referensi yang lemah, sehingga segera setelah gambar tidak lagi digunakan oleh Anda, itu akan menjadi sampah yang dikumpulkan secara otomatis.

koush
sumber
Ngomong-ngomong, apa lisensi untuk ini?
Ehtesh Choudhury
@Shurane - Apache. Saya akan mencatatnya nanti.
koush
1
Tampaknya kita perlu menggunakan yang ini sebagai github.com/koush/ion karena UrlImageViewHelper telah ditinggalkan seperti yang ditunjukkan pada halaman proyek github di github.com/koush/UrlImageViewHelper .
Svetoslav Marinov
69

Pokoknya orang meminta komentar saya untuk mempostingnya sebagai jawaban. saya memposting

URL newurl = new URL(photo_url_str); 
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);
Praveen
sumber
ini singkat dan hebat, terima kasih
Nactus
18
mm .. ini tidak bisa dilakukan dari utas UI sekalipun.
Guy
2
Untuk orang-orang yang memiliki masalah dengan "Pengecualian URL Berubah", mengelilingi baris di atas dalam coba / tangkap. stackoverflow.com/a/24418607/2093088
Riot Goes Woof
1
Ini harus dilakukan dengan menggunakan AsyncTask seperti dijelaskan di atas
B-GangsteR
63

Jawaban yang diterima di atas sangat bagus jika Anda memuat gambar berdasarkan klik tombol, namun jika Anda melakukannya dalam aktivitas baru, itu membekukan UI untuk satu atau dua detik. Melihat sekeliling saya menemukan bahwa asynctask sederhana menghilangkan masalah ini.

Untuk menggunakan asynctask, tambahkan kelas ini di akhir aktivitas Anda:

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

Dan panggil dari metode onCreate () Anda menggunakan:

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

Hasilnya adalah aktivitas yang dimuat dengan cepat dan tampilan gambar yang muncul sepersekian detik kemudian tergantung pada kecepatan jaringan pengguna.

Kyle Clegg
sumber
Ini cepat dan ringkas. Bertemu dengan kebutuhan saya dengan baik! Terima kasih!
Mark Murphy
pada cap waktu saya, ini bekerja untuk saya!
Carpk
25

Anda juga bisa menggunakan tampilan LoadingImageView ini untuk memuat gambar dari url:

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

Setelah Anda menambahkan file kelas dari tautan itu, Anda dapat membuat tampilan gambar url:

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

Dalam kode:

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

Dan perbarui dengan menggunakan:

image.setImageDrawable("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");
Blundell
sumber
Sampel yang bagus, tapi saya tidak percaya ini aman untuk thread. Saya mencoba menggunakannya dalam Async onPostExecute, namun onPostExecute kadang-kadang bisa berakhir sebelum callback diterima menghasilkan gambar nol.
Jimmy
Ini mengelola utasnya sendiri. Jadi mengapa tidak meminta ASyncTask Anda kembali ke UI setelah selesai, dengan url yang Anda inginkan. Dengan begitu Anda tidak memiliki utas pemijahan utas.
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
sumber
Terima kasih banyak, contoh sempurna yang saya cari ................, tetapi di bawah Topik yang salah ini seharusnya ada di sini ==> Cara mengatur gambar imageView dari string ?
VenomVendor
10

Hai Saya punya kode yang paling mudah coba ini

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

coba ini

Abhishek Karande
sumber
10

Perpustakaan modern terbaik untuk tugas seperti itu menurut saya adalah Picasso by Square. Memungkinkan memuat gambar ke ImageView oleh URL dengan satu-liner:

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

Saya baru-baru ini menemukan utas di sini , karena saya harus melakukan hal serupa untuk tampilan daftar dengan gambar, tetapi prinsipnya sederhana, karena Anda dapat membaca di kelas sampel pertama yang ditunjukkan di sana (oleh jleedev). Anda mendapatkan aliran input gambar (dari 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();
}

Kemudian Anda menyimpan gambar sebagai Drawable dan Anda dapat meneruskannya ke ImageView (via setImageDrawable). Sekali lagi dari cuplikan kode atas lihat seluruh utas.

InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
Djumaka
sumber
Saya tidak memiliki DefaultHttpClient di proyek saya.
Stepan Yakovenko
8

Banyak info bagus di sini ... Baru-baru ini saya menemukan kelas bernama SmartImageView yang tampaknya berfungsi sangat baik sejauh ini. Sangat mudah untuk digabungkan dan digunakan.

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

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

UPDATE : Saya akhirnya menulis posting blog tentang ini , jadi periksalah untuk bantuan menggunakan SmartImageView.

PEMBARUAN 2 : Sekarang saya selalu menggunakan Picasso untuk ini (lihat di atas) dan sangat merekomendasikannya. :)

Ben Jakuben
sumber
7

Ini adalah jawaban yang terlambat, seperti yang disarankan di atas AsyncTaskakan dan setelah googling sedikit saya menemukan satu cara lagi untuk masalah ini.

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

imageView.setImageDrawable(drawable);

Inilah fungsi lengkapnya:

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

Jangan lupa untuk menambahkan izin berikut di Anda AndroidManifest.xmluntuk mengakses internet.

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

Saya mencoba ini sendiri dan saya belum menghadapi masalah apa pun.

IgniteCoders
sumber
Ini sebenarnya sangat bagus untuk minimalis! Perlu diingat bahwa itu diperlukan untuk berjalan di tambahan Threadkarena utas UI tidak memungkinkan untuk operasi jaringan.
creativecreatorormaybenot
6
imageView.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));//try/catch IOException and MalformedURLException outside
yingted
sumber
5

Ini akan membantu Anda ...

Tetapkan tampilan gambar dan muat gambar ke dalamnya .....

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

Kemudian Tetapkan metode ini:

    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
sumber
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
sumber
4

Versi dengan penanganan pengecualian dan tugas async:

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
sumber
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
sumber
3

Cara sederhana dan bersih untuk melakukan ini adalah dengan menggunakan perpustakaan open source Prime .

HandlerExploit
sumber
3

Kode ini diuji, benar-benar berfungsi.

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
sumber
3

Bekerja untuk imageView dalam wadah apa pun, seperti tampilan kisi listview, tata letak 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
sumber
+1 terima kasih atas solusi lengkap dan mudah.
PeteH
3

Coba dengan cara ini, semoga ini akan membantu Anda untuk menyelesaikan masalah Anda.

Di sini saya menjelaskan tentang cara menggunakan perpustakaan eksternal "AndroidQuery" untuk memuat gambar dari url / server secara asyncTask dengan juga gambar yang dimuat ke cache file perangkat atau area cache.

  • Unduh pustaka "AndroidQuery" dari sini
  • Salin / tempel toples ini ke folder lib proyek dan tambahkan pustaka ini ke proyek build-path
  • Sekarang saya tunjukkan demo cara menggunakannya.

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
sumber
3

Android Query dapat menanganinya untuk Anda dan banyak lagi (seperti cache dan proses pemuatan).

Lihatlah di sini .

Saya pikir adalah pendekatan terbaik.

Bruno Krebs
sumber