Загрузить изображение с URL

156

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

Как этого достичь?

Санат Пандей
источник
Возможный дубликат Как загрузить ImageView по URL в Android?
Blahdiblah
посмотрите на эти вопросы и сфокусируйтесь на первых ответах, здесь вы можете найти два простых и полных способа сделать это: первый метод (более полный) или второй метод (более простой)
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);
rajath
источник
60
Вы действительно не должны использовать это, поскольку это блокирует поток пользовательского интерфейса. Эта библиотека будет обрабатывать потоки и загрузку для вас: github.com/koush/UrlImageViewHelper
koush
16
Нет, если вы запускаете этот блок в отдельном потоке за вычетом setImageBitmap
Джонатан
его работу я отображал в виде миниатюр и при просмотре изображения по клику. Я использовал daillay dspog, но он открывается через 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, так как его тело отсутствует.
София
это круто. @ София, что ты имеешь в виду под уборкой? Что делать, если у вас есть неизвестное количество фотографий?
5
@ 5er В первоначальном ответе некоторые скобки были неуместны. С тех пор я очистил его, чтобы вы могли использовать его как есть.
Кайл Клегг
Не забывайте, что нам нужно также добавить разрешение в манифесте: <Использования-разрешения android: name = "android.permission.INTERNET" />
mike20132013
1
Это замечательно для обучения / взлома (upvoted), но для любого производства вы должны использовать библиотеку Imageloader, их так много. Мой любимый - Universal Image Loader, Picasso и т. Д.
AmeyaB
31

попробуй picasssoкрасиво и заканчивай в одном утверждении

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

учебное пособие: https://youtu.be/DxRqxsEPc2s

vijaicv
источник
3
Пикассо, Glide мои любимые тоже. Заявление Glide очень похоже на Picasso, с большим улучшением размера кеша.
anhtuannd
1
Это должен быть новый ответ, хотя всегда приятно знать, как это сделать самостоятельно. Отличная статья, объясняющая оба пути: medium.com/@crossphd/…
Мартин Йекель
9

Попробуйте добавить файл Picasso lib jar

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


    }


}

в своей деятельности возьмите imageview и установите ресурс imageDownload (url, yourImageview);


источник
5

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

UrlImageViewHelper.setUrlDrawable (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);
            }
        });
}
DàChún
источник
2

Есть два пути:

1) Использование библиотеки Glide Это лучший способ загрузить изображение из URL, потому что при попытке отобразить тот же URL во второй раз, оно будет отображаться из улова, так что улучшите производительность приложения

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

зависимость: implementation 'com.github.bumptech.glide:glide:4.10.0'


2) Использование Stream. Здесь вы хотите создать растровое изображение из изображения URL

URL url = new URL("YourUrl");
Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
imageView.setImageBitmap(bitmap);
Sanjayrajsinh
источник
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);
        }
    }
}
Рахул Райна
источник
1

Для меня фреска является лучшей среди других библиотек.

Просто настройте Fresco, а затем просто установите imageURI следующим образом:

draweeView.setImageURI(uri);

Проверьте этот ответ, объясняющий некоторые преимущества Fresco.

Уайлдер Перейра
источник