Android'de URL'ye göre ImageView nasıl yüklenir? [kapalı]


530

Bir URL'de referans verilen bir resmi nasıl kullanırsınız? ImageView ?



Yanıtlar:


713

Gönderen Android geliştirici :

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

AndroidManifest.xmlİnternete erişmek için aşağıdaki izinlerin ayarlandığından emin olun .

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

39
Bu harika. Ve listede çok daha yüksek olmalı. Asynctask, UI'yi dondurmadan yüklenmesine izin verir!
Kyle Clegg

3
AsyncTasks bir seri yürütücü kullanır, yani her görüntü birer birer yüklenir ve paralel iş parçacığı yüklemesi yapmaz.
Blundell

2
Kaynak bağlantı artık çalışmıyor ...
hecvd

10
Giriş akışı örneğinizde kapalı değil. En iyi denemek / yakalamak sonunda blokta yapılır.
Risadinha

2
Bu yöntem hala alakalı mi? OnClick () yöntemi ve amacı hakkında biraz kafam karıştı
tccpg288

170

1. Picasso , uygulamanızda sorunsuz bir şekilde resim yüklemeye izin verir - genellikle bir kod satırında!

Gradle kullanın:

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

Sadece bir satır kod!

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

2. Glide Düzgün kaydırmaya odaklanan Android için bir görüntü yükleme ve önbellek kütüphanesi

Gradle kullanın:

repositories {
  mavenCentral() 
  google()
}

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

// Basit bir görünüm için:

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

3. fresk Android uygulamalarında görüntüleri görüntülemek için güçlü bir sistemdir.Fresk görüntü yükleme ve görüntüleme ilgilenir, bu yüzden gerekmez.

Fresk ile Başlarken


2
Eğer url localhost ise, görüntü xampp gibi gelişmekte olan sistem yerel sunucu veritabanında olduğu anlamına gelir, yine de url = 'den görüntü alabilirim.
blackjack

2
@blackjack - app localhost akıllı telefonun kendisi olurdu. Gelişen sisteminize erişmek için akıllı telefonun ve gelişmekte olan sisteminizin aynı ağda olması gerekir ve bu ağdaki gelişmekte olan sisteminizin IP adresini kullanmanız gerekir.
Ridcully

1
düğmeye resim yüklemek için picasso kullanmak mümkün mü?
Mehdi

1
@chiragkyada bu kod ile denemek Picasso.with (context) .load (url) .into (button_view); ancak şu hatayı gösteriyor: içine (button_view)
Mehdi

1
Bunun kabul edilen cevap olması gerektiğini düşünüyorum
Udo

150

Önce görüntüyü indirmeniz gerekecek

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

Sonra bitmap ImageView içine ayarlamak için Imageview.setImageBitmap kullanın


126
haklısın. ancak sadece bu 3 satır sorunu çözmeye yardımcı olur. URL newurl = yeni URL (photo_url_str); mIcon_val = BitmapFactory.decodeStream (newurl.openConnection () .getInputStream ()); profile_photo.setImageBitmap (mIcon_val); ur cevap için teşekkürler.
Praveen

2
URL için - import java.net.URL; özel statik son int IO_BUFFER_SIZE = 4 * 1024; sonuncusu neydi?
Steve

12

@SACPK, oyunuzu cevaplayabilmeniz için yorumunuzu cevap olarak yazmalısınız
Jim Wallace

cevap benim için doğru ,, bir cevap olarak göndermek :)
omnia Mm

71

Bunu yapmak için bir sınıf yazdım, çünkü çeşitli projelerimde tekrar eden bir ihtiyaç gibi görünüyor:

https://github.com/koush/UrlImageViewHelper

UrlImageViewHelper, bir ImageView öğesini bir URL'de bulunan bir resimle dolduracaktır.

Örnek bir Google Görsel Arama yapacak ve sonuçları eşzamansız olarak yükleyecek / gösterecektir.

UrlImageViewHelper, BitmapDrawables'ın tüm görüntü URL'lerini otomatik olarak indirir, kaydeder ve önbelleğe alır. Yinelenen URL'ler belleğe iki kez yüklenmeyecek. Bitmap belleği zayıf bir referans karma tablosu kullanılarak yönetilir, bu nedenle görüntü artık sizin tarafınızdan kullanılmadığı anda otomatik olarak çöp toplanır.


Bu arada lisans nedir?
Ehtesh Choudhury

@Shurane - Apache. Daha sonra not edeceğim.
koush

1
Biz yerine bunu kullanmak gerekmez görünüyor github.com/koush/ion UrlImageViewHelper gibi en github projenin sayfada gösterildiği şekilde kullanımdan kaldırılmıştır github.com/koush/UrlImageViewHelper .
Svetoslav Marinov

69

Her neyse insanlar yorumumu cevap olarak göndermelerini istiyorlar. gönderiyorum.

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

bu kısa ve harika, teşekkürler
Nactus

18
mm .. bu UI iş parçacığından yapılamaz.
Guy

2
"Hatalı Biçimlendirilmiş URL İstisnası" ile ilgili sorunları olan kişiler için yukarıdaki satırları bir dene / yakala içine alın. stackoverflow.com/a/24418607/2093088
Riot Woof Goes

1
Bu, yukarıda açıklandığı gibi AsyncTask kullanılarak yapılmalıdır
B-GangsteR

63

Görüntüyü bir düğme tıklamasına göre yüklüyorsanız, yukarıdaki kabul edilen cevap harikadır, ancak yeni bir etkinlikte yapıyorsanız, kullanıcı arayüzünü bir veya iki saniye boyunca dondurur. Etrafa baktığımda basit bir asenkronun bu sorunu ortadan kaldırdığını gördüm.

Bir asynctask kullanmak için bu sınıfı etkinliğinizin sonuna ekleyin:

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

Ve onCreate () yönteminizden şunu kullanarak arayın:

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

Sonuç, hızlı bir şekilde yüklenen bir etkinlik ve kullanıcının ağ hızına bağlı olarak bir saniye sonra bölünen bir görüntülemedir.


Bu hızlı ve kompakttı. Benim ihtiyaçlarını güzel bir araya geldi! Teşekkürler!
Mark Murphy

benim zaman damgası itibariyle, bu benim için çalıştı!
Carpk

25

Bir url'den resim yüklemek için bu LoadingImageView görünümünü de kullanabilirsiniz:

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

Sınıf dosyasını bu bağlantıdan ekledikten sonra, bir url resim görünümü başlatabilirsiniz:

xml biçiminde:

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

Kodda:

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

Ve kullanarak güncelleyin:

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

Güzel örnek, ama bu iş parçacığı güvenli olduğuna inanmıyorum. Bir Async onPostExecute içinde kullanmaya çalışıyorum, ancak onPostExecute bazen geri arama alınmadan önce boş bir görüntü oluşturma sona erebilir.
Jimmy

Bu kendi iş parçacığını yönetir. Öyleyse neden ASyncTask'ınız bittiğinde, istediğiniz url ile UI'yi geri aramasın. Bu şekilde iplikleri yumurtlayan iplikler olmaz.
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;
}
}

Çok teşekkürler, ben aradım mükemmel bir örnek ................, ama yanlış Konu altında bu burada olması gerekir ==> Nasıl bir dize imageView görüntüsünü ayarlamak için ?
VenomVendor

10

Merhaba ben bunu denemek en kolay kodu var

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

bunu dene


10

Bence böyle bir görev için en modern kütüphane Picasso by Square. Tek katmanlı bir URL'ye göre ImageView'e resim yüklemeye izin verir:

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

9

Son zamanlarda burada bir iş parçacığı buldum , ben görüntüleri ile bir liste görünümü için benzer bir şey yapmak zorunda, ama prensip basit, orada gösterilen ilk örnek sınıf okuyabilirsiniz (jleedev tarafından). Görüntünün Giriş akışını alırsınız (web'den)

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

Sonra görüntüyü Drawable olarak kaydedersiniz ve ImageView'e (setImageDrawable ile) iletebilirsiniz. Yine üst kod snippet'inden tüm iş parçacığına bir göz atın.

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

Projemde DefaultHttpClient yok.
Stepan Yakovenko


7

Bu geç cevap, yukarıda önerilen AsyncTaskolacak ve biraz googling sonra ben bu sorun için bir yol daha bulundu.

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

imageView.setImageDrawable(drawable);

İşte tam fonksiyon:

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

AndroidManifest.xmlİnternete erişmek için aşağıdaki izinleri eklemeyi unutmayın .

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

Bunu kendim denedim ve henüz bir sorunla karşılaşmadım.


Bu aslında minimalizm için çok güzel! ThreadUI iş parçacığının ağ işlemlerine izin vermediği için fazladan çalıştırılması gerektiğini unutmayın .
creativecreatorormaybenot

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

5

Bu sana yardım edecek...

Görüntü görünümünü tanımlayın ve içine resim yükleyin .....

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

Ardından bu yöntemi tanımlayın:

    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

İstisna işleme ve zaman uyumsuz görev içeren sürüm:

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

Bu kod test edildi, tamamen çalışıyor.

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

Liste görünümü ızgara görünümü, normal düzen gibi herhangi bir kapta imageView için çalışma

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

Komple, kolay çözüm için +1 teşekkürler.
PeteH

3

Bu şekilde deneyin, umarım bu sorununuzu çözmenize yardımcı olacaktır.

Burada url / sunucudan asyncTask şekilde görüntü yüklemek için "AndroidQuery" harici kütüphanesinin nasıl kullanılacağını açıkladım.

  • "AndroidQuery" kütüphanesini buradan indirin
  • Bu kavanozu proje lib klasörüne kopyala / yapıştır ve bu kütüphaneyi proje oluşturma yoluna ekle
  • Şimdi nasıl kullanılacağına dair demo gösteriyorum.

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 bunu sizin için ve çok daha fazlasını yapabilir (önbellek ve yükleme ilerlemesi gibi).

Buraya bir bak .

Bence en iyi yaklaşım bu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.