Завантажте зображення з URL-адреси


156

У мене є URL-адреса зображення. Я хочу відобразити зображення з цієї URL-адреси у ImageView, але мені цього не вдається.

Як цього можна досягти?



подивіться на ці питання та зосередьтеся на перших відповідях, тут ви можете знайти два простих і повних способи зробити це: перший метод (більш повний) або другий метод (простіше)
lory105

ви можете використовувати завантажувач зображень Picasso та Glide та відображати для перегляду зображень
shweta c

Відповіді:


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
Вам дійсно не слід використовувати це, оскільки це блокує потік інтерфейсу користувача. Ця бібліотека буде обробляти потоки та завантаження для вас: github.com/koush/UrlImageViewHelper
koush

16
Якщо не запустити цей блок окремим потоком за мінусом setImageBitmap
Джонатан

його робочий показ у мініатюрах та onclick imageview я використав dsplaying dailog, але він відкривається після 10секунд
Prasad

4
@koush - Цей код буде добре, якщо його загорнути в AsyncTask.
Грег Браун

2
Ви повинні робити будь-які операції з мережевою мережею в окремому потоці. Коли растровий файл завантажений, ви можете використовувати ImageView.post () або Handler.post ()
Володимир Шалашенко

311

Прийнята вище відповідь чудова, якщо ви завантажуєте зображення на основі натискання кнопки, однак якщо ви робите це в новому заході, він заморожує інтерфейс користувача на секунду-дві. Озирнувшись, я виявив, що проста асинтакція усунула цю проблему.

Щоб використовувати асинтакт, щоб додати цей клас наприкінці своєї діяльності:

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

І дзвоніть зі свого методу onCreate (), використовуючи:

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

Не забудьте додати нижче дозвіл у свій файл маніфесту

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

Для мене чудово працює. :)


2
Мені подобається це рішення, вам слід просто очистити код для onPostExecute, оскільки його тіло поза.
Софія

це чудово. @Sofija, що ти мав на увазі під очищенням? що робити, якщо у вас є невідома кількість фотографій?
5er

@ 5er У оригінальній відповіді у мене були деякі дужки. З тих пір я його очистив, тож ви зможете використовувати його як зараз.
Кайл Клегг

Не забувайте, що нам також потрібно додати дозвіл у маніфест: <використання-дозвіл android: name = "android.permission.INTERNET" />
mike20132013

1
Це приголомшливо для навчання / злому (оновлене), але для будь-якого виробництва вам слід використовувати бібліотеку Imageloader, їх так багато. Моя улюблена - "Універсальний завантажувач зображень", "Пікассо" тощо
AmeyaB

31

спробуйте picasssoприємне і закінчення в одному висловлюванні

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

підручник: https://youtu.be/DxRqxsEPc2s


3
Picasso, Glide - теж мої фаворити. Заява Glide досить схожа на Picasso, значно покращивши розмір кешу.
anhtuannd

1
Це має бути новою відповіддю, хоча завжди приємно знати, як це зробити самостійно. Чудова стаття, що пояснює обидва способи: medium.com/@crossphd/…
Martin Jäkel


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


    }


}

у своїй діяльності візьміть перегляд зображень та встановіть ресурс imageDownload (url, yourImageview);


5

UrlImageViewHelper заповнить ImageView зображенням, знайденим за URL-адресою. UrlImageViewHelper автоматично завантажує, зберігає та кешує всі зображення URL-адрес BitmapDrawables. Дублікати URL-адрес не завантажуватимуться в пам'ять двічі. Пам’яткою бітових карт керується за допомогою слабкої хеш-таблиці таблиці, тому щойно ви більше не використовуєте зображення, воно буде автоматично зібране сміття.

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

https://github.com/koush/UrlImageViewHelper


4

Виходячи з цієї відповіді, я пишу власний завантажувач.

З ефектом завантаження та ефектом появи:

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

Додати дозвіл

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

І виконати:

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

4

Ось зразок коду для відображення зображення з URL-адреси.

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

Кращий метод, який я намагався замість використання будь-яких бібліотек

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

додати дозвіл на Інтернет у маніфест

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

ніж створити метод, як показано нижче,

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

тепер додайте це у свій метод onCreate,

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


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

це для мене працює.


2

Код нижче показує, як встановити ImageView з URL-рядку, використовуючи RxAndroid. Спочатку додайте бібліотеку RxAndroid 2.0

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'

}

тепер використовуйте setImageFromUrl для встановлення зображення.

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

Є два способи:

1) Використання бібліотеки Glide Це найкращий спосіб завантажити зображення з URL-адреси, оскільки при спробі відобразити той же URL-адресу вдруге він відображатиметься з уловки, тому покращуйте продуктивність програми

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

залежність: implementation 'com.github.bumptech.glide:glide:4.10.0'


2) Використання потоку. Тут ви хочете створити растрові зображення з URL-адреси

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

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

Ось ви йдете

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

Що ivdpfirst?
Big McLargeHuge

Ідентифікатор ImageView, який використовується у дизайні xml
Винятковий

1

Спробуйте це:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.