URL'den resim yükle


156

Resim URL’m var. Bir ImageView bu URL'den bir görüntü görüntülemek istiyorum ama bunu yapamıyorum.

Bu nasıl başarılabilir?



bu sorulara bakın ve ilk cevaplara odaklanın, burada bunu yapmanın iki basit ve eksiksiz yolunu bulabilirsiniz: ilk yöntem (daha eksiksiz) veya ikinci yöntem (daha basit)
lory105

Picasso ve Glide görüntü yükleyiciyi kullanabilir ve
hayal

Yanıtlar:


240
URL url = new URL("http://image10.bizrate-images.com/resize?sq=60&uid=2216744464");
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
imageView.setImageBitmap(bmp);

60
UI iş parçacığını engellediği için bunu gerçekten kullanmamalısınız. Bu kütüphane iş parçacığı ve sizin için indirme işleyecektir: github.com/koush/UrlImageViewHelper
koush

16
Eğer u blok set eksi bir iş parçacığı üzerinde çalıştırırsanız değilImageBitmap
Jonathan

onun çalışma i küçük resimler ve onclick imagView görüntüleme dsplaying dailog kullanılan ama 10 saniye sonra açılır
Prasad

4
@koush - Bu kod, bir AsyncTask.
Greg Brown

2
Ayrı bir iş parçacığında herhangi bir networl işlemi yapmalısınız, Bitmap yüklendiğinde ImageView.post () veya Handler.post ()
Volodymyr Shalashenko

311

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.

Etkinliğinizin sonunda bu sınıfı eklemek üzere bir zaman uyumsuz kullanmak için:

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

Manifest dosyanıza aşağıdaki izni eklemeyi unutmayın

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

Benim için harika çalışıyor. :)


2
Bu çözümü beğendim, sadece vücut dışarı olduğu için onPostExecute için kodu temizlemelisiniz.
Sofija

bu harika. @Sofija temizlik ile ne demek istediniz? bilinmeyen sayıda fotoğrafınız varsa ne olur?
5er

@ 5er Orijinal yanıtta bazı köşeli parantezlerim vardı. O zamandan beri temizledim, böylece olduğu gibi kullanabilirsiniz.
Kyle Clegg

Manifest'te de izin eklememiz gerektiğini unutmamak gerekir: <Kullanımlar-İzin android: isim = "android.permission.INTERNET" />
mike20132013

1
Bu, öğrenme / hackleme (yükseltilmiş) için harika ama herhangi bir üretim için bir Imageloader kütüphanesi kullanmalısınız, orada çok fazla var. En sevdiğim, Universal Image loader, Picasso vb.
AmeyaB

31

picasssogüzel denemek ve bir ifadede bitiyor

Picasso.with(context)
                .load(ImageURL)
                .resize(width,height).into(imageView);

öğretici: https://youtu.be/DxRqxsEPc2s


3
Picasso, Glide benim favorilerim. Glide'ın ifadesi, önbellek boyutunda çok fazla iyileşme ile Picasso'ya oldukça benziyor.
anhtuannd

1
Bu yeni cevap olmalı, ancak bunu kendi başınıza nasıl yapacağınızı bilmek her zaman güzel. Her iki yolu da açıklayan harika makale: medium.com/@crossphd/…
Martin

9

Bu ekleme picasso lib jar dosyasını deneyin

Picasso.with(context)
                .load(ImageURL)
                .resize(width,height).noFade().into(imageView);

7
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;
import android.widget.Toast;

public class imageDownload {

    Bitmap bmImg;
    void downloadfile(String fileurl,ImageView img)
    {
        URL myfileurl =null;
        try
        {
            myfileurl= new URL(fileurl);

        }
        catch (MalformedURLException e)
        {

            e.printStackTrace();
        }

        try
        {
            HttpURLConnection conn= (HttpURLConnection)myfileurl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            int length = conn.getContentLength();
            int[] bitmapData =new int[length];
            byte[] bitmapData2 =new byte[length];
            InputStream is = conn.getInputStream();
            BitmapFactory.Options options = new BitmapFactory.Options();

            bmImg = BitmapFactory.decodeStream(is,null,options);

            img.setImageBitmap(bmImg);

            //dialog.dismiss();
            } 
        catch(IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
//          Toast.makeText(PhotoRating.this, "Connection Problem. Try Again.", Toast.LENGTH_SHORT).show();
        }


    }


}

etkinliğinizde imageview alın ve kaynak imageDownload (url, Imageview) ayarınızı yapın;


5

UrlImageViewHelper, bir ImageView öğesini bir URL'de bulunan bir resimle dolduracaktır. 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.

UrlImageViewHelper.setUrlDrawable (imageView, "http://example.com/image.png");

https://github.com/koush/UrlImageViewHelper


4

Bu cevaba dayanarak kendi yükleyicimi yazıyorum.

Yükleme efekti ve Görünüm efekti ile:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ProgressBar;

import java.io.InputStream;

/**
 * Created by Sergey Shustikov (pandarium.shustikov@gmail.com) at 2015.
 */
public class DownloadImageTask extends AsyncTask<String, Void, Bitmap>
{
    public static final int ANIMATION_DURATION = 250;
    private final ImageView mDestination, mFakeForError;
    private final String mUrl;
    private final ProgressBar mProgressBar;
    private Animation.AnimationListener mOutAnimationListener = new Animation.AnimationListener()
    {
        @Override
        public void onAnimationStart(Animation animation)
        {

        }

        @Override
        public void onAnimationEnd(Animation animation)
        {
            mProgressBar.setVisibility(View.GONE);
        }

        @Override
        public void onAnimationRepeat(Animation animation)
        {

        }
    };
    private Animation.AnimationListener mInAnimationListener = new Animation.AnimationListener()
    {
        @Override
        public void onAnimationStart(Animation animation)
        {
            if (isBitmapSet)
                mDestination.setVisibility(View.VISIBLE);
            else
                mFakeForError.setVisibility(View.VISIBLE);
        }

        @Override
        public void onAnimationEnd(Animation animation)
        {

        }

        @Override
        public void onAnimationRepeat(Animation animation)
        {

        }
    };
    private boolean isBitmapSet;

    public DownloadImageTask(Context context, ImageView destination, String url)
    {
        mDestination = destination;
        mUrl = url;
        ViewGroup parent = (ViewGroup) destination.getParent();
        mFakeForError = new ImageView(context);
        destination.setVisibility(View.GONE);
        FrameLayout layout = new FrameLayout(context);
        mProgressBar = new ProgressBar(context);
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.gravity = Gravity.CENTER;
        mProgressBar.setLayoutParams(params);
        FrameLayout.LayoutParams copy = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        copy.gravity = Gravity.CENTER;
        copy.width = dpToPx(48);
        copy.height = dpToPx(48);
        mFakeForError.setLayoutParams(copy);
        mFakeForError.setVisibility(View.GONE);
        mFakeForError.setImageResource(android.R.drawable.ic_menu_close_clear_cancel);
        layout.addView(mProgressBar);
        layout.addView(mFakeForError);
        mProgressBar.setIndeterminate(true);
        parent.addView(layout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    }

    protected Bitmap doInBackground(String... urls)
    {
        String urlDisplay = mUrl;
        Bitmap bitmap = null;
        try {
            InputStream in = new java.net.URL(urlDisplay).openStream();
            bitmap = BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return bitmap;
    }

    protected void onPostExecute(Bitmap result)
    {
        AlphaAnimation in = new AlphaAnimation(0f, 1f);
        AlphaAnimation out = new AlphaAnimation(1f, 0f);
        in.setDuration(ANIMATION_DURATION * 2);
        out.setDuration(ANIMATION_DURATION);
        out.setAnimationListener(mOutAnimationListener);
        in.setAnimationListener(mInAnimationListener);
        in.setStartOffset(ANIMATION_DURATION);
        if (result != null) {
            mDestination.setImageBitmap(result);
            isBitmapSet = true;
            mDestination.startAnimation(in);
        } else {
            mFakeForError.startAnimation(in);
        }
        mProgressBar.startAnimation(out);
    }
    public int dpToPx(int dp) {
        DisplayMetrics displayMetrics = mDestination.getContext().getResources().getDisplayMetrics();
        int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
        return px;
    }
}

İzin ekle

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

Ve yürütün:

 new DownloadImageTask(context, imageViewToLoad, urlToImage).execute();

4

İşte URL'den görüntü gösterme için örnek kod.

public static Void downloadfile(String fileurl, ImageView img) {
        Bitmap bmImg = null;
        URL myfileurl = null;
        try {
            myfileurl = new URL(fileurl);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        try {
            HttpURLConnection conn = (HttpURLConnection) myfileurl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            int length = conn.getContentLength();
            if (length > 0) {
                int[] bitmapData = new int[length];
                byte[] bitmapData2 = new byte[length];
                InputStream is = conn.getInputStream();
                bmImg = BitmapFactory.decodeStream(is);
                img.setImageBitmap(bmImg);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3

Herhangi bir kütüphane kullanmak yerine denedim en iyi yöntem

public Bitmap getbmpfromURL(String surl){
    try {
        URL url = new URL(surl);
        HttpURLConnection urlcon = (HttpURLConnection) url.openConnection();
        urlcon.setDoInput(true);
        urlcon.connect();
        InputStream in = urlcon.getInputStream();
        Bitmap mIcon = BitmapFactory.decodeStream(in);
        return  mIcon;
    } catch (Exception e) {
        Log.e("Error", e.getMessage());
        e.printStackTrace();
        return null;
    }
}

3

manifest'te İnternet izni ekle

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

aşağıdaki gibi bir yöntem oluşturmak yerine,

 public static Bitmap getBitmapFromURL(String src) {
    try {
        Log.e("src", src);
        URL url = new URL(src);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        Log.e("Bitmap", "returned");
        return myBitmap;
    } catch (IOException e) {
        e.printStackTrace();
        Log.e("Exception", e.getMessage());
        return null;
    }
}

şimdi bunu onCreate yönteminize ekleyin,

 ImageView img_add = (ImageView) findViewById(R.id.img_add);


img_add.setImageBitmap(getBitmapFromURL("http://www.deepanelango.me/wpcontent/uploads/2017/06/noyyal1.jpg"));

bu benim için çalışıyor.


2

Aşağıdaki kod, RxAndroid kullanarak ImageView'i bir url dizesinden nasıl ayarlayacağınızı gösterir. İlk olarak, RxAndroid kitaplığı 2.0'ı ekleyin

dependencies {
    // RxAndroid
    compile 'io.reactivex.rxjava2:rxandroid:2.0.0'
    compile 'io.reactivex.rxjava2:rxjava:2.0.0'

    // Utilities
    compile 'org.apache.commons:commons-lang3:3.5'

}

şimdi görüntüyü ayarlamak için setImageFromUrl kullanın.

public void setImageFromUrl(final ImageView imageView, final String urlString) {

    Observable.just(urlString)
        .filter(new Predicate<String>() {
            @Override public boolean test(String url) throws Exception {
                return StringUtils.isNotBlank(url);
            }
        })
        .map(new Function<String, Drawable>() {
            @Override public Drawable apply(String s) throws Exception {
                URL url = null;
                try {
                    url = new URL(s);
                    return Drawable.createFromStream((InputStream) url.getContent(), "profile");
                } catch (final IOException ex) {
                    return null;
                }
            }
        })
        .filter(new Predicate<Drawable>() {
            @Override public boolean test(Drawable drawable) throws Exception {
                return drawable != null;
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Consumer<Drawable>() {
            @Override public void accept(Drawable drawable) throws Exception {
                imageView.setImageDrawable(drawable);
            }
        });
}

2

İki yol var:

1) Glide kitaplığını kullanma Bu, url'den resim yüklemenin en iyi yoludur, çünkü aynı url'yi ikinci kez görüntülemeye çalıştığınızda yakalamadan görüntülenir, böylece uygulama performansını artırın

Glide.with(context).load("YourUrl").into(imageView);

bağımlılık: implementation 'com.github.bumptech.glide:glide:4.10.0'


2) Akış kullanma. Burada url resminden bitmap oluşturmak istiyorsunuz

URL url = new URL("YourUrl");
Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
imageView.setImageBitmap(bitmap);

1
loadImage("http://relinjose.com/directory/filename.png");

Hadi bakalım

void loadImage(String image_location) {
    URL imageURL = null;
    if (image_location != null) {
        try {
            imageURL = new URL(image_location);         
            HttpURLConnection connection = (HttpURLConnection) imageURL
                    .openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream inputStream = connection.getInputStream();
            bitmap = BitmapFactory.decodeStream(inputStream);// Convert to bitmap
            ivdpfirst.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        //set any default
    }
}

Nedir ivdpfirst?
Büyük McLargeHuge

Xml tasarımında kullanılan ImageView kimliği.
Olağanüstü

1

Bunu dene:

InputStream input = contentResolver.openInputStream(httpuri);
Bitmap b = BitmapFactory.decodeStream(input, null, options);

1
public class MainActivity extends Activity {

    Bitmap b;
    ImageView img;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img = (ImageView)findViewById(R.id.imageView1);
        information info = new information();
        info.execute("");
    }

    public class information extends AsyncTask<String, String, String>
    {
        @Override
        protected String doInBackground(String... arg0) {

            try
            {
                URL url = new URL("http://10.119.120.10:80/img.jpg");
                InputStream is = new BufferedInputStream(url.openStream());
                b = BitmapFactory.decodeStream(is);

            } catch(Exception e){}
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            img.setImageBitmap(b);
        }
    }
}

1

Bana göre Fresco diğer kütüphaneler arasında en iyisi.

Sadece kurulum sonra Fresco ve basitçe böyle imageURI ayarlayın:

draweeView.setImageURI(uri);

Fresco'nun bazı avantajlarını açıklayan bu cevaba göz atın .

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.