74

I want to display image on screen. Image should come from URL, and not drawable.

Code is here:

<ImageView android:id="@+id/ImageView01" android:src = "http://l.yimg.com/a/i/us/we/52/21.gif"
    android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>

but it gives error at compile time.

How do I display image from URL in Android?

jww
  • 97,681
  • 90
  • 411
  • 885
Jignesh Ansodariya
  • 12,583
  • 24
  • 81
  • 113

10 Answers10

114

You can directly show image from web without downloading it. Please check the below function . It will show the images from the web into your image view.

public static Drawable LoadImageFromWebOperations(String url) {
    try {
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, "src name");
        return d;
    } catch (Exception e) {
        return null;
    }
}

then set image to imageview using code in your activity.

Chirag
  • 56,621
  • 29
  • 151
  • 198
25

I tried this code working for me,get image directly from url

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

use inside onCreate() method

new DownloadImageTask((ImageView) findViewById(R.id.image)) .execute("http://scoopak.com/wp-content/uploads/2013/06/free-hd-natural-wallpapers-download-for-pc.jpg");

Satheeshkumar Somu
  • 496
  • 1
  • 7
  • 14
  • works, but I had to add: ... to avoid issue of "Cleartext HTTP traffic not permitted" (see https://stackoverflow.com/questions/45940861/android-8-cleartext-http-traffic-not-permitted) – Razvan_TK9692 May 12 '20 at 22:33
  • 1
    This is driving me crazy! Why is not working on me! – stefanosn Nov 23 '20 at 03:03
16

You can try this which I find in another question.

Android, Make an image at a URL equal to ImageView's image

try {
  ImageView i = (ImageView)findViewById(R.id.image);
  Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageUrl).getContent());
  i.setImageBitmap(bitmap); 
} catch (MalformedURLException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}
Community
  • 1
  • 1
DzMonster
  • 479
  • 5
  • 12
  • 1
    Do you import necessary file? For example java.io.IOException and so on. – DzMonster Jun 19 '13 at 06:57
  • 1
    If your device runs on 3.x or 4.x,You need use handler or asynctask to make download operation out of UI Thread.Because download operation became forbid in UI Thread.This blog may be useful http://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html. – DzMonster Jun 22 '13 at 05:41
16

You can try with Picasso, it's really nice and easy. Don't forget to add the permissions in the manifest.

Picasso.with(context)
                     .load("http://ImageURL")
                     .resize(width,height)
                     .into(imageView );

You can also take a look at a tutorial here : Youtube / Github

r3dm4n
  • 1,175
  • 2
  • 18
  • 33
6

For simple example,
http://www.helloandroid.com/tutorials/how-download-fileimage-url-your-device

You will have to use httpClient and download the image (cache it if required) ,

solution offered for displaying images in listview, essentially same code(check the code where imageview is set from url) for displaying.

Lazy load of images in ListView

Community
  • 1
  • 1
sat
  • 40,138
  • 28
  • 93
  • 102
4
InputStream URLcontent = (InputStream) new URL(url).getContent();
Drawable image = Drawable.createFromStream(URLcontent, "your source link");

this has worked for me

Yiğit Doğuş Özçelik
  • 2,763
  • 2
  • 16
  • 19
  • 1
    what is "your source link" basically? i have an image url of Google and i want that image to load in image view used above code but it return null ? how to solve this ? – Saad Bilal Mar 03 '14 at 08:43
  • http://stackoverflow.com/questions/6122599/android-drawable-createfromstreamis-srcname-whats-the-2nd-parameter-meanin - This'll answer the question – 0xC0DED00D Mar 07 '14 at 20:54
  • 2
    Are `url` and `"your source link"` the same? – zionpi May 25 '15 at 06:53
4

I retried an image from a URL and stored on my SD-card using the following code:

public String Downloadfromurl(String Url)
{

 String filepath=null;

 try {

  URL url = new URL(Url);

  //create the new connection

  HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

  //set up some things on the connection
  urlConnection.setRequestMethod("GET");

  urlConnection.setDoOutput(true); 

   //and connect!

  urlConnection.connect();

  //set the path where we want to save the file
  //in this case, going to save it on the root directory of the
  //sd card.

  folder = new File(Environment.getExternalStorageDirectory().toString()+"/img");

  folder.mkdirs();

  //create a new file, specifying the path, and the filename
  //which we want to save the file as.

  String filename= "page"+no+".PNG";   

  file = new File(folder,filename);

  if(file.createNewFile())

  {

   file.createNewFile();

  }

  //this will be used to write the downloaded data into the file we created
  FileOutputStream fileOutput = new FileOutputStream(file);

  //this will be used in reading the data from the internet
  InputStream inputStream = urlConnection.getInputStream();

  //this is the total size of the file
  int totalSize = urlConnection.getContentLength();
  //variable to store total downloaded bytes
  int downloadedSize = 0;

  //create a buffer...
  byte[] buffer = new byte[1024];
  int bufferLength = 0; //used to store a temporary size of the buffer

  //now, read through the input buffer and write the contents to the file
  while ( (bufferLength = inputStream.read(buffer)) > 0 ) {
   //add the data in the buffer to the file in the file output stream (the file on the sd card
   fileOutput.write(buffer, 0, bufferLength);
   //add up the size so we know how much is downloaded
   downloadedSize += bufferLength;
   //this is where you would do something to report the prgress, like this maybe
   Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ;
  }
  //close the output stream when done
  fileOutput.close();
  if(downloadedSize==totalSize)  
      filepath=file.getPath();

 //catch some possible errors...
 } catch (MalformedURLException e) {
  e.printStackTrace();
 } catch (IOException e) {
  filepath=null;
  e.printStackTrace();
 }
 Log.i("filepath:"," "+filepath) ;


 return filepath;

}
Hauleth
  • 22,873
  • 4
  • 61
  • 112
GK_
  • 1,212
  • 1
  • 12
  • 26
  • **If you want to display the image from sdcard use this ** Bitmap bmp = BitmapFactory.decodeFile(folder + "/page"+no+".PNG"); imgview.setImageBitmap(bmp); – GK_ Nov 01 '12 at 09:29
2

Write the code using ASyncTask for http handling.

Bitmap b;
ImageView img;
......
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){}
......
img.setImageBitmap(b);
Rahul Raina
  • 3,322
  • 25
  • 30
1

I've same issue. I test this code and works well. This code Get Image from URL and put in - "bmpImage"

URL url = new URL("http://your URL");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(60000 /* milliseconds */);
            conn.setConnectTimeout(65000 /* milliseconds */);
            conn.setRequestMethod("GET");
            conn.setDoInput(true);
            conn.connect();
            int response = conn.getResponseCode();
            //Log.d(TAG, "The response is: " + response);
            is = conn.getInputStream();


            BufferedInputStream bufferedInputStream = new BufferedInputStream(is);

            Bitmap bmpImage = BitmapFactory.decodeStream(bufferedInputStream);
Avtandil Kavrelishvili
  • 1,651
  • 3
  • 27
  • 37
-1

You can simply use the Glide API. It avoids all the boilerplate code and the task can be achieved in two lines of code. You refer this link https://blog.mindorks.com/downloading-and-showing-image-with-glide-library-in-android. Enjoy

klaus19
  • 23
  • 1
  • 10
  • While link can be useful it's preferable to post solution direct on SO. – Pochmurnik Sep 16 '19 at 11:41
  • Step 1 ) Go to build.gradle and copy paste these two dependencies 1) implementation 'com.github.bumptech.glide:glide:4.9.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0' Then create an ImageView in your relative layout. 3) Put this code in your Java file – klaus19 Sep 16 '19 at 12:02