Bir URL'de referans verilen bir resmi nasıl kullanırsınız? ImageView
?
Bir URL'de referans verilen bir resmi nasıl kullanırsınız? ImageView
?
Yanıtlar:
Gönderen Android geliştirici :
// 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
İnternete erişmek için aşağıdaki izinlerin ayarlandığından emin olun .
<uses-permission android:name="android.permission.INTERNET" />
1. Picasso , uygulamanızda sorunsuz bir şekilde resim yüklemeye izin verir - genellikle bir kod satırında!
Gradle kullanın:
implementation 'com.squareup.picasso:picasso:2.71828'
Sadece bir satır kod!
Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);
2. Glide Düzgün kaydırmaya odaklanan Android için bir görüntü yükleme ve önbellek kütüphanesi
Gradle kullanın:
repositories {
mavenCentral()
google()
}
dependencies {
implementation 'com.github.bumptech.glide:glide:4.7.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
}
// Basit bir görünüm için:
Glide.with(this).load("http://i.imgur.com/DvpvklR.png").into(imageView);
3. fresk Android uygulamalarında görüntüleri görüntülemek için güçlü bir sistemdir.Fresk görüntü yükleme ve görüntüleme ilgilenir, bu yüzden gerekmez.
Önce görüntüyü indirmeniz gerekecek
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;
}
Sonra bitmap ImageView içine ayarlamak için Imageview.setImageBitmap kullanın
Bunu yapmak için bir sınıf yazdım, çünkü çeşitli projelerimde tekrar eden bir ihtiyaç gibi görünüyor:
https://github.com/koush/UrlImageViewHelper
UrlImageViewHelper, bir ImageView öğesini bir URL'de bulunan bir resimle dolduracaktır.
Örnek bir Google Görsel Arama yapacak ve sonuçları eşzamansız olarak yükleyecek / gösterecektir.
UrlImageViewHelper, BitmapDrawables'ın tüm görüntü URL'lerini otomatik olarak indirir, kaydeder ve önbelleğe alır. Yinelenen URL'ler belleğe iki kez yüklenmeyecek. Bitmap belleği zayıf bir referans karma tablosu kullanılarak yönetilir, bu nedenle görüntü artık sizin tarafınızdan kullanılmadığı anda otomatik olarak çöp toplanır.
Her neyse insanlar yorumumu cevap olarak göndermelerini istiyorlar. gönderiyorum.
URL newurl = new URL(photo_url_str);
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);
Görüntüyü bir düğme tıklamasına göre yüklüyorsanız, yukarıdaki kabul edilen cevap harikadır, ancak yeni bir etkinlikte yapıyorsanız, kullanıcı arayüzünü bir veya iki saniye boyunca dondurur. Etrafa baktığımda basit bir asenkronun bu sorunu ortadan kaldırdığını gördüm.
Bir asynctask kullanmak için bu sınıfı etkinliğinizin sonuna ekleyin:
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);
}
}
Ve onCreate () yönteminizden şunu kullanarak arayın:
new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
.execute(MY_URL_STRING);
Sonuç, hızlı bir şekilde yüklenen bir etkinlik ve kullanıcının ağ hızına bağlı olarak bir saniye sonra bölünen bir görüntülemedir.
Bir url'den resim yüklemek için bu LoadingImageView görünümünü de kullanabilirsiniz:
http://blog.blundellapps.com/imageview-with-loading-spinner/
Sınıf dosyasını bu bağlantıdan ekledikten sonra, bir url resim görünümü başlatabilirsiniz:
xml biçiminde:
<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"
/>
Kodda:
final LoaderImageView image = new LoaderImageView(this, "http://developer.android.com/images/dialog_buttons.png");
Ve kullanarak güncelleyin:
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;
}
}
Merhaba ben bunu denemek en kolay kodu var
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"/>
bunu dene
Bence böyle bir görev için en modern kütüphane Picasso by Square. Tek katmanlı bir URL'ye göre ImageView'e resim yüklemeye izin verir:
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
Son zamanlarda burada bir iş parçacığı buldum , ben görüntüleri ile bir liste görünümü için benzer bir şey yapmak zorunda, ama prensip basit, orada gösterilen ilk örnek sınıf okuyabilirsiniz (jleedev tarafından). Görüntünün Giriş akışını alırsınız (web'den)
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();
}
Sonra görüntüyü Drawable olarak kaydedersiniz ve ImageView'e (setImageDrawable ile) iletebilirsiniz. Yine üst kod snippet'inden tüm iş parçacığına bir göz atın.
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
Burada çok iyi bilgiler var ... Son zamanlarda SmartImageView adında bir ders buldum. Eklenmesi ve kullanımı çok kolaydır.
http://loopj.com/android-smart-image-view/
https://github.com/loopj/android-smart-image-view
GÜNCELLEME : Bu konuda bir blog yazısı yazdım , bu yüzden SmartImageView'ı kullanma konusunda yardım için göz atın.
2. GÜNCELLEME : Şimdi bunun için her zaman Picasso kullanıyorum (yukarıya bakın) ve kesinlikle tavsiye ederim. :)
Bu geç cevap, yukarıda önerilen AsyncTask
olacak ve biraz googling sonra ben bu sorun için bir yol daha bulundu.
Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");
imageView.setImageDrawable(drawable);
İşte tam fonksiyon:
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
İnternete erişmek için aşağıdaki izinleri eklemeyi unutmayın .
<uses-permission android:name="android.permission.INTERNET" />
Bunu kendim denedim ve henüz bir sorunla karşılaşmadım.
Thread
UI iş parçacığının ağ işlemlerine izin vermediği için fazladan çalıştırılması gerektiğini unutmayın .
Bu sana yardım edecek...
Görüntü görünümünü tanımlayın ve içine resim yükleyin .....
Imageview i = (ImageView) vv.findViewById(R.id.img_country);
i.setImageBitmap(DownloadFullFromUrl(url));
Ardından bu yöntemi tanımlayın:
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);
İstisna işleme ve zaman uyumsuz görev içeren sürüm:
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;
}
Bunu yapmanın basit ve temiz bir yolu, açık kaynak kodlu Prime kütüphanesini kullanmaktır .
Liste görünümü ızgara görünümü, normal düzen gibi herhangi bir kapta imageView için çalışma
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 );
Bu şekilde deneyin, umarım bu sorununuzu çözmenize yardımcı olacaktır.
Burada url / sunucudan asyncTask şekilde görüntü yüklemek için "AndroidQuery" harici kütüphanesinin nasıl kullanılacağını açıkladım.
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 bunu sizin için ve çok daha fazlasını yapabilir (önbellek ve yükleme ilerlemesi gibi).
Buraya bir bak .
Bence en iyi yaklaşım bu.