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


530

Bagaimana Anda menggunakan gambar yang dirujuk oleh URL dalam ImageView?



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

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


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


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


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


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

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.


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

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

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


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

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

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


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.


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

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

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

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

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

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

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

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

3

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

Lihatlah di sini .

Saya pikir adalah pendekatan terbaik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.