Załaduj obraz z adresu URL

156

Mam adres URL obrazu. Chcę wyświetlić obraz z tego adresu URL w ImageView, ale nie mogę tego zrobić.

Jak można to osiągnąć?

Sanat Pandey
źródło
spójrz na te pytania i skup się na pierwszych odpowiedziach, tutaj możesz znaleźć dwa proste i kompletne sposoby, aby to zrobić: pierwsza metoda (bardziej kompletna) lub druga metoda (prościej)
lory105
możesz użyć programu ładującego obrazy Picassa i Glide i wyświetlić go w
widoku obrazu

Odpowiedzi:

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
źródło
60
Naprawdę nie powinieneś tego używać, ponieważ blokuje wątek interfejsu użytkownika. Ta biblioteka zajmie się wątkami
koush
16
Nie, jeśli uruchomisz ten blok w osobnym wątku bez setImageBitmap
Jonathan
jego działa wyświetlam w miniaturach i onclick imageview Użyłem dsplaying dailog, ale otwiera się po 10 sekundach
Prasad
4
@koush - ten kod byłby w porządku, gdyby był opakowany w plik AsyncTask.
Greg Brown
2
Wszelkie operacje sieciowe należy wykonywać w osobnym wątku. Po załadowaniu mapy bitowej można użyć funkcji ImageView.post () lub Handler.post ()
Volodymyr Shalashenko
311

Przyjęta powyżej odpowiedź jest świetna, jeśli ładujesz obraz na podstawie kliknięcia przycisku, jednak jeśli robisz to w ramach nowej czynności, zawiesza interfejs użytkownika na sekundę lub dwie. Rozglądając się wokół stwierdziłem, że proste asynchroniczne zadanie wyeliminowało ten problem.

Aby użyć zadania asynchronicznego w celu dodania tej klasy na koniec działania:

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

I wywołaj z metody onCreate () używając:

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

Nie zapomnij dodać poniższych uprawnień w pliku manifestu

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

U mnie działa świetnie. :)

Kyle Clegg
źródło
2
Podoba mi się to rozwiązanie, powinieneś po prostu wyczyścić kod dla onPostExecute, ponieważ jego treść jest niedostępna.
Sofija,
to jest świetne. @Sofija co miałeś na myśli mówiąc o sprzątaniu? co jeśli masz nieznaną liczbę zdjęć?
5er
@ 5er W oryginalnej odpowiedzi niektóre nawiasy nie pasowały. Od tego czasu wyczyściłem go, więc powinieneś móc go używać tak, jak jest.
Kyle Clegg
Nie zapominajmy, że musimy również dodać uprawnienia w manifeście: <uses-Permissions android: name = "android.permission.INTERNET" />
mike20132013
1
Jest to świetne rozwiązanie do nauki / hakowania (uznanie), ale do każdej produkcji powinieneś użyć biblioteki Imageloader, jest ich tak wiele. Moim ulubionym jest Universal Image loader, Picasso itp.
AmeyaB
31

spróbuj picasssoładnie i kończy się jednym stwierdzeniem

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

samouczek: https://youtu.be/DxRqxsEPc2s

vijaicv
źródło
3
Picasso, Glide też są moimi ulubionymi. Oświadczenie Glide jest dość podobne do Picassa, ze znaczną poprawą rozmiaru pamięci podręcznej.
anhtuannd
1
To powinna być nowa odpowiedź, chociaż zawsze dobrze jest wiedzieć, jak to zrobić samodzielnie. Świetny artykuł wyjaśniający obie strony: medium.com/@crossphd/…
Martin Jäkel
9

Spróbuj tego dodać plik jar picasso lib

Picasso.with(context)
                .load(ImageURL)
                .resize(width,height).noFade().into(imageView);
Rakesh Rangani
źródło
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();
        }


    }


}

w swojej aktywności weź imageview i ustaw zasób imageDownload (url, yourImageview);


źródło
5

UrlImageViewHelper wypełni ImageView obrazem znalezionym pod adresem URL. UrlImageViewHelper automatycznie pobierze, zapisze i buforuje wszystkie adresy URL obrazów BitmapDrawables. Zduplikowane adresy URL nie zostaną dwukrotnie załadowane do pamięci. Pamięć bitmap jest zarządzana przy użyciu słabej referencyjnej tabeli skrótów, więc gdy tylko obraz nie jest już używany, zostanie automatycznie usunięty.

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

https://github.com/koush/UrlImageViewHelper

koush
źródło
4

Na podstawie tej odpowiedzi piszę własny loader.

Z efektem ładowania i efektem wyglądu:

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 ([email protected]) 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;
    }
}

Dodaj uprawnienia

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

I wykonaj:

 new DownloadImageTask(context, imageViewToLoad, urlToImage).execute();
Sergey Shustikov
źródło
4

Oto przykładowy kod do wyświetlania obrazu z adresu 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();
        }
    }
Niranj Patel
źródło
3

Najlepsza metoda, którą wypróbowałem zamiast używać jakichkolwiek bibliotek

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;
    }
}
Sabari Karthik
źródło
3

dodaj pozwolenie internetowe w manifeście

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

niż stworzyć metodę jak poniżej,

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

teraz dodaj to do swojej metody onCreate,

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


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

to działa dla mnie.

Jinal Awaiya
źródło
2

Poniższy kod pokazuje, jak ustawić ImageView na podstawie ciągu adresu URL, używając RxAndroid. Najpierw dodaj bibliotekę 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'

}

teraz użyj setImageFromUrl do ustawienia obrazu.

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
źródło
2

Istnieją dwa sposoby:

1) Korzystanie z biblioteki Glide Jest to najlepszy sposób na załadowanie obrazu z adresu URL, ponieważ przy próbie wyświetlenia tego samego adresu URL po raz drugi wyświetli się on po przechwyceniu, więc popraw wydajność aplikacji

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

zależność: implementation 'com.github.bumptech.glide:glide:4.10.0'


2) Korzystanie z usługi Stream. Tutaj chcesz utworzyć bitmapę z obrazu url

URL url = new URL("YourUrl");
Bitmap bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
imageView.setImageBitmap(bitmap);
Sanjayrajsinh
źródło
1
loadImage("http://relinjose.com/directory/filename.png");

Proszę bardzo

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
    }
}
Wyjątkowy
źródło
Co ivdpfirst?
Big McLargeHuge
Identyfikator ImageView używany w projekcie xml.
Wyjątkowy
1

Spróbuj tego:

InputStream input = contentResolver.openInputStream(httpuri);
Bitmap b = BitmapFactory.decodeStream(input, null, options);
chung
źródło
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);
        }
    }
}
Rahul Raina
źródło
1

Dla mnie Fresco jest najlepsza spośród innych bibliotek.

Po prostu skonfiguruj Fresco, a następnie po prostu ustaw imageURI w następujący sposób:

draweeView.setImageURI(uri);

Zapoznaj się z odpowiedzią wyjaśniającą niektóre zalety Fresco.

Wilder Pereira
źródło