Android에서 URL로 ImageView를로드하는 방법은 무엇입니까? [닫은]


530

에서 URL이 참조하는 이미지를 어떻게 사용 ImageView합니까?


1
이 하나를 사용해보십시오 stackoverflow.com/questions/14332296/…
comeGetSome

답변:


713

에서 안드로이드 개발자 :

// show The Image in a ImageView
new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
            .execute("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");

public void onClick(View v) {
    startActivity(new Intent(this, IndexActivity.class));
    finish();

}

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

AndroidManifest.xml인터넷에 액세스 할 수 있도록 다음 권한이 설정되어 있는지 확인하십시오 .

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

39
대단해. 그리고 목록에서 훨씬 높아야합니다. 비동기 작업을 사용하면 UI를 정지시키지 않고도로드 할 수 있습니다!
Kyle Clegg 5

3
AsyncTasks는 직렬 실행기를 사용합니다. 즉, 각 이미지는 한 번에 하나씩로드되고 병렬 스레드로드는 수행되지 않습니다.
Blundell

2
소스 링크가 더 이상 작동하지 않습니다 ...
hecvd

10
예제에서 입력 스트림이 닫히지 않았습니다. try / catch의 finally 블록에서 가장 잘 수행됩니다.
Risadinha

2
이 방법은 여전히 ​​관련이 있습니까? 나는 OnClick () 메소드와 그 목적에 대해 약간 혼란스러워합니다
tccpg288

170

1. Picasso 는 응용 프로그램에서 번거롭지 않은 이미지 로딩을 허용합니다. 종종 한 줄의 코드로도 가능합니다!

Gradle 사용 :

implementation 'com.squareup.picasso:picasso:2.71828'

한 줄의 코드 만!

Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);

2. 글라이드 부드러운 스크롤링에 중점을 둔 Android 용 이미지 로딩 및 캐싱 라이브러리

Gradle 사용 :

repositories {
  mavenCentral() 
  google()
}

dependencies {
   implementation 'com.github.bumptech.glide:glide:4.7.1'
   annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
}

// 간단한보기 :

  Glide.with(this).load("http://i.imgur.com/DvpvklR.png").into(imageView);

삼. 프레스코 는 안드로이드 응용 프로그램에서 이미지를 표시하는 강력한 시스템입니다.

Fresco 시작하기


2
따라서 URL이 localhost이면 이미지가 xampp와 같은 개발 시스템 로컬 서버 데이터베이스에 있음을 의미하지만 여전히 URL에서 이미지를 가져올 수 있습니다 =.
블랙 잭

2
@blackjack-앱의 로컬 호스트는 스마트 폰 자체입니다. 개발 시스템에 액세스하려면 스마트 폰과 개발 시스템이 동일한 네트워크에 있어야하며 해당 네트워크에서 개발 시스템의 IP 주소를 사용해야합니다.
Ridcully

1
picasso를 사용하여 버튼에 이미지를로드 할 수 있습니까?
mahdi

1
@ chiragkyada 나는이 코드로 시도 Picasso.with (context) .load (url) .into (button_view); 하지만 그것은 ~에 대한 오류 표시 : into (button_view)
mahdi

1
나는 이것이 정답이라고 생각한다
Udo

150

먼저 이미지를 다운로드해야합니다

public static Bitmap loadBitmap(String url) {
    Bitmap bitmap = null;
    InputStream in = null;
    BufferedOutputStream out = null;

    try {
        in = new BufferedInputStream(new URL(url).openStream(), IO_BUFFER_SIZE);

        final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
        out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
        copy(in, out);
        out.flush();

        final byte[] data = dataStream.toByteArray();
        BitmapFactory.Options options = new BitmapFactory.Options();
        //options.inSampleSize = 1;

        bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,options);
    } catch (IOException e) {
        Log.e(TAG, "Could not load Bitmap from: " + url);
    } finally {
        closeStream(in);
        closeStream(out);
    }

    return bitmap;
}

그런 다음 Imageview.setImageBitmap을 사용하여 비트 맵을 ImageView로 설정하십시오.


126
너가 맞아. 그러나이 세 줄만 문제를 해결하는 데 도움이됩니다. URL newurl = 새 URL (photo_url_str); mIcon_val = BitmapFactory.decodeStream (newurl.openConnection () .getInputStream ()); profile_photo.setImageBitmap (mIcon_val); 답장을 보내 주셔서 감사합니다.
Praveen

2
URL의 경우 가져 오기 java.net.URL; private static final int IO_BUFFER_SIZE = 4 * 1024; 마지막 것은 무엇입니까?
Steve

12
여기에 코드를 참조하십시오 : stackoverflow.com/questions/3118691/…
OneWorld

@SACPK 투표에 참여하려면 의견으로 답변을 작성해야합니다.
Jim Wallace

대답은 나에게 옳았다. 답으로 게시하라 :)
omnia Mm

71

나는 다양한 프로젝트에서 되풀이되는 요구 인 것처럼 이것을 처리하기 위해 수업을 썼습니다.

https://github.com/koush/UrlImageViewHelper

UrlImageViewHelper는 URL에서 찾은 이미지로 ImageView를 채 웁니다.

샘플은 Google 이미지 검색을 수행하고 결과를 비동기 적으로로드 / 표시합니다.

UrlImageViewHelper는 BitmapDrawables의 모든 이미지 URL을 자동으로 다운로드, 저장 및 캐시합니다. 중복 된 URL은 메모리에 두 번로드되지 않습니다. 비트 맵 메모리는 약한 참조 해시 테이블을 사용하여 관리되므로 이미지를 더 이상 사용하지 않으면 자동으로 가비지 수집됩니다.


그런데 이것에 대한 라이센스는 무엇입니까?
Ehtesh Choudhury

@Shurane-아파치. 나중에 메모하겠습니다.
koush

1
github 프로젝트 페이지의 github.com/koush/UrlImageViewHelper 에 표시된 것처럼 UrlImageViewHelper가 더 이상 사용되지 않으므로 github.com/koush/ion 대신 github.com/koush/ion사용해야 합니다.
Svetoslav Marinov 2016 년

69

어쨌든 사람들은 내 의견을 답변으로 게시하도록 요청합니다. 게시 중입니다.

URL newurl = new URL(photo_url_str); 
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);

감사합니다.
Nactus

18
mm .. 이것은 UI 스레드에서 수행 할 수 없습니다.
Guy

2
"잘못된 URL 예외"에 문제가있는 사용자는 위의 줄을 try / catch로 둘러 쌉니다. stackoverflow.com/a/24418607/2093088
Riot Goes Woof

1
이것은 위에서 설명한 AsyncTask를 사용하여 수행해야합니다
B-GangsteR

63

위의 대답은 버튼 클릭을 기준으로 이미지를로드하는 경우 유용하지만 새로운 활동에서 이미지를로드하면 UI가 1-2 초 동안 정지됩니다. 주변을 둘러 보면 간단한 비동기 작업 으로이 문제가 해결되었습니다.

비동기 작업을 사용하려면 활동이 끝날 때이 클래스를 추가하십시오.

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

결과적으로 빠르게로드되는 활동과 사용자의 네트워크 속도에 따라 잠시 후에 표시되는 이미지보기가 생성됩니다.


이것은 빠르고 컴팩트했습니다. 내 요구를 잘 충족시켰다! 감사!
마크 머피

내 타임 스탬프 기준으로 이것은 나를 위해 일했습니다!
Carpk

25

이 LoadingImageView보기를 사용하여 URL에서 이미지를로드 할 수도 있습니다.

http://blog.blundellapps.com/imageview-with-loading-spinner/

해당 링크에서 클래스 파일을 추가하면 URL 이미지보기를 인스턴스화 할 수 있습니다.

xml에서 :

<com.blundell.tut.LoaderImageView
  android:id="@+id/loaderImageView"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  image="http://developer.android.com/images/dialog_buttons.png"
 />

코드에서 :

final LoaderImageView image = new LoaderImageView(this, "http://developer.android.com/images/dialog_buttons.png");

다음을 사용하여 업데이트하십시오.

image.setImageDrawable("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");

좋은 샘플이지만 이것이 스레드 안전하다고는 생각하지 않습니다. 비동기 onPostExecute에서 사용하려고하지만 콜백이 null 이미지를 렌더링하기 전에 onPostExecute가 종료 될 수 있습니다.
Jimmy

이것은 자체 스레드를 관리합니다. 따라서 원하는 URL로 ASyncTask가 UI를 다시 호출하지 않는 이유는 무엇입니까? 그렇게하면 스레드를 생성하는 스레드가 없습니다.
Blundell

10
public class LoadWebImg extends Activity {

String image_URL=
 "http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png";

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

       ImageView bmImage = (ImageView)findViewById(R.id.image);
    BitmapFactory.Options bmOptions;
    bmOptions = new BitmapFactory.Options();
    bmOptions.inSampleSize = 1;
    Bitmap bm = LoadImage(image_URL, bmOptions);
    bmImage.setImageBitmap(bm);
   }

   private Bitmap LoadImage(String URL, BitmapFactory.Options options)
   {       
    Bitmap bitmap = null;
    InputStream in = null;       
       try {
           in = OpenHttpConnection(URL);
           bitmap = BitmapFactory.decodeStream(in, null, options);
           in.close();
       } catch (IOException e1) {
       }
       return bitmap;               
   }

private InputStream OpenHttpConnection(String strURL) throws IOException{
 InputStream inputStream = null;
 URL url = new URL(strURL);
 URLConnection conn = url.openConnection();

 try{
  HttpURLConnection httpConn = (HttpURLConnection)conn;
  httpConn.setRequestMethod("GET");
  httpConn.connect();

  if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
   inputStream = httpConn.getInputStream();
  }
 }
 catch (Exception ex)
 {
 }
 return inputStream;
}
}

고마워, 난 ................하지만 잘못된 주제에 따라이> == 여기 했어야 찾고 있던 그 완벽한 예 문자열에서 이미지 뷰의 이미지를 설정하는 방법 ?
VenomVendor

10

안녕하세요, 가장 쉬운 코드가 있습니다.

    public class ImageFromUrlExample extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);  
            ImageView imgView =(ImageView)findViewById(R.id.ImageView01);
            Drawable drawable = LoadImageFromWebOperations("http://www.androidpeople.com/wp-content/uploads/2010/03/android.png");
            imgView.setImageDrawable(drawable);

    }

    private Drawable LoadImageFromWebOperations(String url)
    {
          try{
        InputStream is = (InputStream) new URL(url).getContent();
        Drawable d = Drawable.createFromStream(is, "src name");
        return d;
      }catch (Exception e) {
        System.out.println("Exc="+e);
        return null;
      }
    }
   }

main.xml

  <LinearLayout 
    android:id="@+id/LinearLayout01"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
   <ImageView 
       android:id="@+id/ImageView01"
       android:layout_height="wrap_content" 
       android:layout_width="wrap_content"/>

이 시도


10

제 생각에 그러한 작업을위한 가장 현대적인 라이브러리는 Picasso by Square입니다. 하나의 라이너로 URL로 이미지를 ImageView에로드 할 수 있습니다.

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

9

이미지가있는 목록보기에 대해 비슷한 작업을 수행해야하기 때문에 최근에 here here 스레드가 발견 되었지만, 거기에 표시된 첫 번째 샘플 클래스 (jleedev)에서 읽을 수 있으므로 원리는 간단합니다. 웹에서 이미지의 입력 스트림을 얻습니다.

private InputStream fetch(String urlString) throws MalformedURLException, IOException {
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpGet request = new HttpGet(urlString);
    HttpResponse response = httpClient.execute(request);
    return response.getEntity().getContent();
}

그런 다음 이미지를 Drawable로 저장하고 setImageDrawable을 통해 ImageView로 전달할 수 있습니다. 상단 코드 스 니펫에서 다시 전체 스레드를 살펴보십시오.

InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");

내 프로젝트에 DefaultHttpClient가 없습니다.
Stepan Yakovenko

8

여기에 좋은 정보가 많이 있습니다 ... 최근에 실제로 잘 작동하는 것 같은 SmartImageView라는 클래스를 발견했습니다. 통합 및 사용이 매우 쉽습니다.

http://loopj.com/android-smart-image-view/

https://github.com/loopj/android-smart-image-view

업데이트 : 이것대한 블로그 게시물을 작성 했으므로 SmartImageView 사용에 대한 도움말을 확인하십시오.

2ND 업데이트 : 나는 항상 이것을 위해 Picasso를 사용하고 (위 참조) 적극 권장합니다. :)


7

이것은 위의 제안과 같이 늦은 답변 AsyncTask입니다.

Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");

imageView.setImageDrawable(drawable);

다음은 완전한 기능입니다.

public void loadMapPreview () {
    //start a background thread for networking
    new Thread(new Runnable() {
        public void run(){
            try {
                //download the drawable
                final Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");
                //edit the view in the UI thread
                imageView.post(new Runnable() {
                    public void run() {
                        imageView.setImageDrawable(drawable);
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

AndroidManifest.xml인터넷에 액세스하려면 다음 권한을 추가해야합니다 .

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

나는 이것을 직접 시도했지만 아직 아무런 문제가 없습니다.


이것은 실제로 미니멀리즘에 매우 좋습니다! ThreadUI 스레드는 네트워크 작업을 허용하지 않으므로 추가로 실행해야 합니다.
creativecreatoror은 (는)

6
imageView.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));//try/catch IOException and MalformedURLException outside

5

이것은 당신을 도울 것입니다 ...

imageview를 정의하고 이미지를로드하십시오 .....

Imageview i = (ImageView) vv.findViewById(R.id.img_country);
i.setImageBitmap(DownloadFullFromUrl(url));

그런 다음이 방법을 정의하십시오.

    public Bitmap DownloadFullFromUrl(String imageFullURL) {
    Bitmap bm = null;
    try {
        URL url = new URL(imageFullURL);
        URLConnection ucon = url.openConnection();
        InputStream is = ucon.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);
        ByteArrayBuffer baf = new ByteArrayBuffer(50);
        int current = 0;
        while ((current = bis.read()) != -1) {
            baf.append((byte) current);
        }
        bm = BitmapFactory.decodeByteArray(baf.toByteArray(), 0,
                baf.toByteArray().length);
    } catch (IOException e) {
        Log.d("ImageManager", "Error: " + e);
    }
    return bm;
}

4
    String img_url= //url of the image
    URL url=new URL(img_url);
    Bitmap bmp; 
    bmp=BitmapFactory.decodeStream(url.openConnection().getInputStream());
    ImageView iv=(ImageView)findviewById(R.id.imageview);
    iv.setImageBitmap(bmp);

4

예외 처리 및 비동기 작업이있는 버전 :

AsyncTask<URL, Void, Boolean> asyncTask = new AsyncTask<URL, Void, Boolean>() {
    public Bitmap mIcon_val;
    public IOException error;

    @Override
    protected Boolean doInBackground(URL... params) {
        try {
            mIcon_val = BitmapFactory.decodeStream(params[0].openConnection().getInputStream());
        } catch (IOException e) {
            this.error = e;
            return false;
        }
        return true;
    }

    @Override
    protected void onPostExecute(Boolean success) {
        super.onPostExecute(success);
        if (success) {
            image.setImageBitmap(mIcon_val);
        } else {
            image.setImageBitmap(defaultImage);
        }
    }
};
try {
    URL url = new URL(url);
    asyncTask.execute(url);
} catch (MalformedURLException e) {
    e.printStackTrace();
}

3
    private Bitmap getImageBitmap(String url) {
        Bitmap bm = null;
        try {
            URL aURL = new URL(url);
            URLConnection conn = aURL.openConnection();
            conn.connect();
            InputStream is = conn.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            bm = BitmapFactory.decodeStream(bis);
            bis.close();
            is.close();
       } catch (IOException e) {
           Log.e(TAG, "Error getting bitmap", e);
       }
       return bm;
    } 


3

이 코드는 테스트되었으며 완전히 작동합니다.

URL req = new URL(
"http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png"
);
Bitmap mIcon_val = BitmapFactory.decodeStream(req.openConnection()
                  .getInputStream());

3

목록보기 그리드보기, 일반 레이아웃과 같은 모든 컨테이너에서 imageView 작업

 private class LoadImagefromUrl extends AsyncTask< Object, Void, Bitmap > {
        ImageView ivPreview = null;

        @Override
        protected Bitmap doInBackground( Object... params ) {
            this.ivPreview = (ImageView) params[0];
            String url = (String) params[1];
            System.out.println(url);
            return loadBitmap( url );
        }

        @Override
        protected void onPostExecute( Bitmap result ) {
            super.onPostExecute( result );
            ivPreview.setImageBitmap( result );
        }
    }

    public Bitmap loadBitmap( String url ) {
        URL newurl = null;
        Bitmap bitmap = null;
        try {
            newurl = new URL( url );
            bitmap = BitmapFactory.decodeStream( newurl.openConnection( ).getInputStream( ) );
        } catch ( MalformedURLException e ) {
            e.printStackTrace( );
        } catch ( IOException e ) {

            e.printStackTrace( );
        }
        return bitmap;
    }
/** Usage **/
  new LoadImagefromUrl( ).execute( imageView, url );

완전하고 쉬운 솔루션에 대해 +1 감사합니다.
PeteH

3

이 방법을 사용해보십시오. 문제를 해결하는 데 도움이되기를 바랍니다.

여기에서는 asyncTask 방식으로 URL / 서버에서 이미지를로드하기 위해 "AndroidQuery"외부 라이브러리를 사용하여 장치 파일 또는 캐시 영역으로로드 된 이미지를 캐시하는 방법에 대해 설명합니다.

  • 여기에서 "AndroidQuery"라이브러리 다운로드 하십시오.
  • 이 jar을 프로젝트 lib 폴더에 복사 / 붙여 넣기 하고이 라이브러리를 프로젝트 빌드 경로에 추가하십시오.
  • 이제 데모 사용법을 보여줍니다.

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center">

        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/imageFromUrl"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:adjustViewBounds="true"/>
            <ProgressBar
                android:id="@+id/pbrLoadImage"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"/>

        </FrameLayout>
    </LinearLayout>

MainActivity.java

public class MainActivity extends Activity {

private AQuery aQuery;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    aQuery = new AQuery(this);
    aQuery.id(R.id.imageFromUrl).progress(R.id.pbrLoadImage).image("http://itechthereforeiam.com/wp-content/uploads/2013/11/android-gone-packing.jpg",true,true);
 }
}

Note : Here I just implemented common method to load image from url/server but you can use various types of method which can be provided by "AndroidQuery"to load your image easily.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.