android - एंड्रॉइड में यूआरएल द्वारा ImageView कैसे लोड करें?




bitmap (16)

अपवाद हैंडलिंग और एसिंक कार्य के साथ संस्करण:

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

आप ImageView में यूआरएल द्वारा संदर्भित एक छवि का उपयोग कैसे करते हैं?


आपको पहली बार छवि डाउनलोड करनी होगी

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 में बिटमैप सेट करने के लिए Imageview.setImageBitmap का उपयोग करें


एंड्रॉइड क्वेरी आपके लिए और बहुत कुछ संभाल सकती है (जैसे कैश और लोडिंग प्रगति)।

here एक नज़र डालें।

मुझे लगता है कि सबसे अच्छा तरीका है।


ऐसा करने का एक सरल और साफ तरीका ओपन सोर्स लाइब्रेरी Prime का उपयोग करना है।


मेरी राय के लिए इस तरह के एक कार्य के लिए सबसे अच्छी आधुनिक पुस्तकालय स्क्वायर द्वारा Picasso है। यह एक-लाइनर के साथ यूआरएल द्वारा एक छवि दृश्य में एक छवि लोड करने की अनुमति देता है:

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

मैंने इसे संभालने के लिए एक कक्षा लिखी, क्योंकि यह मेरी विभिन्न परियोजनाओं में आवर्ती आवश्यकता है:

https://github.com/koush/UrlImageViewHelper

UrlImageViewHelper एक छवि दृश्य को एक यूआरएल में मिली छवि के साथ भर देगा।

नमूना एक Google छवि खोज करेगा और परिणाम को असीमित रूप से लोड / दिखाएगा।

UrlImageViewHelper स्वचालित रूप से BitmapDrawables सभी छवि urls को डाउनलोड, सहेज और कैश करेगा। डुप्लिकेट यूआरएल दो बार स्मृति में लोड नहीं किया जाएगा। बिटमैप मेमोरी को कमजोर संदर्भ हैश टेबल का उपयोग करके प्रबंधित किया जाता है, इसलिए जैसे ही छवि आपके द्वारा उपयोग नहीं की जाती है, यह कचरा स्वचालित रूप से एकत्रित हो जाएगा।


यह एक देर का जवाब है, जैसा कि AsyncTask ऊपर 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" />

मैंने इसे स्वयं करने की कोशिश की और मुझे अभी तक किसी भी मुद्दे का सामना नहीं करना पड़ा है।


यह कोड परीक्षण किया गया है, यह पूरी तरह से काम कर रहा है।

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

यूआरएल से एक छवि लोड करने के लिए आप इस लोडिंग इमेज व्यू व्यू का भी उपयोग कर सकते हैं:

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

एक बार जब आप उस लिंक से कक्षा फ़ाइल जोड़ लेते हैं तो आप एक यूआरएल छवि दृश्य को तुरंत चालू कर सकते हैं:

एक्सएमएल में:

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

वैसे भी लोग इसे उत्तर के रूप में पोस्ट करने के लिए मेरी टिप्पणी पूछते हैं। मैं पोस्ट कर रहा हूँ

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

धन्यवाद।


एंड्रॉइड डेवलपर से :

// 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" />

1. Picasso आपके आवेदन में परेशानी मुक्त छवि लोडिंग की अनुमति देता है-अक्सर कोड की एक पंक्ति में!

ग्रैडल का प्रयोग करें:

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

कोड की बस एक पंक्ति!

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

एंड्रॉइड पर छवि लोडिंग के कई सामान्य नुकसान स्वचालित रूप से Picasso द्वारा संभाले जाते हैं

  • ImageView रीसाइक्लिंग को संभालना और एडाप्टर में रद्द करना डाउनलोड करें।
  • न्यूनतम स्मृति उपयोग के साथ जटिल छवि परिवर्तन।
  • स्वचालित मेमोरी और डिस्क कैशिंग।

2. Glide एंड्रॉइड के लिए एक छवि लोडिंग और कैशिंग लाइब्रेरी चिकनी स्क्रॉलिंग पर केंद्रित है

ग्रैडल का प्रयोग करें:

repositories {
  mavenCentral() // jcenter() works as well because it pulls from Maven Central
}

dependencies {
  compile 'com.github.bumptech.glide:glide:3.7.0'
  compile 'com.android.support:support-v4:19.1.0'
}

// एक साधारण दृश्य के लिए:

@Override public void onCreate(Bundle savedInstanceState) {
  ...
  ImageView imageView = (ImageView) findViewById(R.id.my_image_view);

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

// एक साधारण छवि सूची के लिए:

 @Override public View getView(int position, View recycled, ViewGroup container) {
      final ImageView myImageView;
      if (recycled == null) {
        myImageView = (ImageView) inflater.inflate(R.layout.my_image_view, container, false);
      } else {
        myImageView = (ImageView) recycled;
      }

      String url = myUrls.get(position);

      Glide
        .with(myFragment)
        .load(url)
        .centerCrop()
        .placeholder(R.drawable.loading_spinner)
        .crossFade()
        .into(myImageView);

      return myImageView;
}

किसी भी कंटेनर में 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 );

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

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

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




imageview