आप URL में संदर्भित छवि का उपयोग कैसे करते हैं ImageView
?
आप URL में संदर्भित छवि का उपयोग कैसे करते हैं ImageView
?
जवाबों:
से Android डेवलपर :
// 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. पिकासो आपके एप्लिकेशन में परेशानी मुक्त छवि लोड करने की अनुमति देता है — अक्सर कोड की एक पंक्ति में!
ग्रेडेल का उपयोग करें:
implementation 'com.squareup.picasso:picasso:2.71828'
कोड की सिर्फ एक लाइन!
Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);
2. सरकना Android के लिए एक छवि लोड हो रहा है और कैशिंग पुस्तकालय चिकनी स्क्रॉल पर ध्यान केंद्रित किया
ग्रेडेल का उपयोग करें:
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);
3. फ्रेस्को एंड्रॉइड एप्लिकेशन में छवियों को प्रदर्शित करने के लिए एक शक्तिशाली प्रणाली है । फ़्रेस्को छवि लोडिंग और डिस्प्ले का ध्यान रखता है, इसलिए आपके पास नहीं है।
आपको सबसे पहले इमेज डाउनलोड करनी होगी
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 का उपयोग करें
मैंने इसे संभालने के लिए एक वर्ग लिखा, क्योंकि यह मेरी विभिन्न परियोजनाओं में एक पुनरावृत्ति की आवश्यकता प्रतीत होती है:
https://github.com/koush/UrlImageViewHelper
UrlImageViewHelper एक URL पर मिलने वाली छवि से एक ImageView भर देगा।
नमूना एक Google छवि खोज करेगा और परिणामों को अतुल्यकालिक रूप से लोड / दिखाएगा।
UrlImageViewHelper स्वचालित रूप से डाउनलोड करेगा, सहेजेगा, और कैश करेगा सभी छवि BitmapDrawables का आग्रह करता है। डुप्लिकेट url को दो बार मेमोरी में लोड नहीं किया जाएगा। बिटमैप मेमोरी को कमजोर संदर्भ हैश तालिका का उपयोग करके प्रबंधित किया जाता है, इसलिए जैसे ही छवि अब आपके द्वारा उपयोग नहीं की जाती है, यह स्वचालित रूप से एकत्रित कचरा होगा।
वैसे भी लोग मेरी टिप्पणी को उत्तर के रूप में पोस्ट करने के लिए कहते हैं। मैं पोस्ट कर रहा हूँ
URL newurl = new URL(photo_url_str);
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);
यदि आप एक बटन क्लिक के आधार पर छवि लोड कर रहे हैं, तो ऊपर दिया गया स्वीकृत उत्तर बहुत अच्छा है, हालांकि यदि आप इसे एक नई गतिविधि में कर रहे हैं तो यह UI को एक या दो सेकंड के लिए जमा देता है। चारों ओर देखने पर मैंने पाया कि एक साधारण एसिंक्टस्क ने इस समस्या को खत्म कर दिया।
एक अभ्रक का उपयोग करने के लिए अपनी गतिविधि के अंत में इस वर्ग को जोड़ें:
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);
परिणाम एक त्वरित भरी हुई गतिविधि और एक छवि दृश्य है जो उपयोगकर्ता के नेटवर्क की गति के आधार पर बाद में एक विभाजन को दिखाता है।
आप किसी url से चित्र लोड करने के लिए इस LoadingImageView दृश्य का उपयोग भी कर सकते हैं:
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");
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;
}
}
नमस्ते, मेरे पास सबसे आसान कोड यही है
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"/>
इसे इस्तेमाल करे
मेरी राय में इस तरह के कार्य के लिए सबसे अच्छा आधुनिक पुस्तकालय पिकासो बाय स्क्वायर है। यह एक लाइनर के साथ URL द्वारा ImageView में एक छवि लोड करने की अनुमति देता है:
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
मुझे हाल ही में यहां एक धागा मिला है , क्योंकि मुझे छवियों के साथ एक सूची के लिए एक समान काम करना है, लेकिन सिद्धांत सरल है, जैसा कि आप वहां दिखाए गए पहले नमूना वर्ग में पढ़ सकते हैं (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();
}
तब आप इमेज को ड्राएबल के रूप में स्टोर करते हैं और आप इसे इमेज व्यू (सेटआईमेजडेबल के माध्यम से) पास कर सकते हैं। ऊपरी कोड से फिर से स्निपेट पूरे धागे पर एक नज़र डालते हैं।
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
यहाँ में बहुत सारी अच्छी जानकारी है ... मुझे हाल ही में स्मार्टइमेज व्यू नामक एक वर्ग मिला है जो अब तक वास्तव में अच्छी तरह से काम कर रहा है। शामिल करने और उपयोग करने के लिए बहुत आसान है।
http://loopj.com/android-smart-image-view/
https://github.com/loopj/android-smart-image-view
अद्यतन : मैंने इस बारे में एक ब्लॉग पोस्ट लिखना समाप्त कर दिया है , इसलिए SmartImageView का उपयोग करने में सहायता के लिए इसे देखें।
2ND अद्यतन : मैं अब इसके लिए पिकासो का उपयोग करता हूं (ऊपर देखें) और अत्यधिक अनुशंसा करता हूं। :)
यह एक विलंबित उत्तर है, जैसा कि ऊपर सुझाया गया है 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" />
मैंने खुद यह कोशिश की और मुझे अभी तक किसी भी मुद्दे का सामना नहीं करना पड़ा है।
Thread
क्योंकि UI थ्रेड नेटवर्क संचालन के लिए अनुमति नहीं देता है।
यह आपकी मदद करेगा ...
छवि को परिभाषित करें और उसमें छवि लोड करें .....
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;
}
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);
अपवाद हैंडलिंग और async कार्य के साथ संस्करण:
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();
}
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;
}
ऐसा करने का एक सरल और साफ तरीका है ओपन सोर्स लाइब्रेरी प्राइम का उपयोग करना ।
किसी भी कंटेनर में इमेज व्यू के लिए कार्य करना, जैसे सूची दृश्य, सामान्य लेआउट
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 );
इस तरह से प्रयास करें, आशा है कि यह आपकी समस्या को हल करने में आपकी मदद करेगा।
यहाँ मैं इस बारे में बताता हूँ कि "AndroidQuery" बाहरी पुस्तकालय को url / सर्वर से लोड छवि के लिए asyncTask तरीके से कैसे उपयोग किया जाए, साथ ही लोड की गई छवि को डिवाइस फ़ाइल या कैश क्षेत्र में कैश किया जाए।
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.
Android Query आपके और बहुत अधिक (जैसे कैश और लोडिंग प्रगति) को संभाल सकता है।
यहां देखिए ।
मुझे लगता है कि सबसे अच्छा तरीका है।