Bagaimana Anda menggunakan gambar yang dirujuk oleh URL dalam ImageView
?
Bagaimana Anda menggunakan gambar yang dirujuk oleh URL dalam ImageView
?
Jawaban:
Dari pengembang 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);
}
}
Pastikan Anda memiliki izin berikut yang ditetapkan AndroidManifest.xml
untuk mengakses internet.
<uses-permission android:name="android.permission.INTERNET" />
1. Picasso memungkinkan pemuatan gambar tanpa repot di aplikasi Anda — sering kali dalam satu baris kode!
Gunakan Gradle:
implementation 'com.squareup.picasso:picasso:2.71828'
Hanya satu baris kode!
Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);
2. Glide Perpustakaan pemuatan dan penyimpanan gambar untuk Android yang berfokus pada pengguliran yang lancar
Gunakan Gradle:
repositories {
mavenCentral()
google()
}
dependencies {
implementation 'com.github.bumptech.glide:glide:4.7.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
}
// Untuk tampilan sederhana:
Glide.with(this).load("http://i.imgur.com/DvpvklR.png").into(imageView);
3. fresco adalah sistem yang kuat untuk menampilkan gambar di aplikasi Android. Frco menangani pemuatan dan tampilan gambar, jadi Anda tidak perlu melakukannya.
Anda harus mengunduh gambar terlebih dahulu
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;
}
Kemudian gunakan Imageview.setImageBitmap untuk mengatur bitmap ke dalam ImageView
Saya menulis sebuah kelas untuk menangani hal ini, karena tampaknya menjadi kebutuhan berulang dalam berbagai proyek saya:
https://github.com/koush/UrlImageViewHelper
UrlImageViewHelper akan mengisi ImageView dengan gambar yang ditemukan di URL.
Sampel akan melakukan Pencarian Gambar Google dan memuat / menampilkan hasilnya secara tidak sinkron.
UrlImageViewHelper akan secara otomatis mengunduh, menyimpan, dan men-cache semua url gambar BitmapDrawables. URL duplikat tidak akan dimuat ke memori dua kali. Memori bitmap dikelola dengan menggunakan tabel hash referensi yang lemah, sehingga segera setelah gambar tidak lagi digunakan oleh Anda, itu akan menjadi sampah yang dikumpulkan secara otomatis.
Pokoknya orang meminta komentar saya untuk mempostingnya sebagai jawaban. saya memposting
URL newurl = new URL(photo_url_str);
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);
Jawaban yang diterima di atas sangat bagus jika Anda memuat gambar berdasarkan klik tombol, namun jika Anda melakukannya dalam aktivitas baru, itu membekukan UI untuk satu atau dua detik. Melihat sekeliling saya menemukan bahwa asynctask sederhana menghilangkan masalah ini.
Untuk menggunakan asynctask, tambahkan kelas ini di akhir aktivitas Anda:
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);
}
}
Dan panggil dari metode onCreate () Anda menggunakan:
new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
.execute(MY_URL_STRING);
Hasilnya adalah aktivitas yang dimuat dengan cepat dan tampilan gambar yang muncul sepersekian detik kemudian tergantung pada kecepatan jaringan pengguna.
Anda juga bisa menggunakan tampilan LoadingImageView ini untuk memuat gambar dari url:
http://blog.blundellapps.com/imageview-with-loading-spinner/
Setelah Anda menambahkan file kelas dari tautan itu, Anda dapat membuat tampilan gambar url:
dalam 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"
/>
Dalam kode:
final LoaderImageView image = new LoaderImageView(this, "http://developer.android.com/images/dialog_buttons.png");
Dan perbarui dengan menggunakan:
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;
}
}
Hai Saya punya kode yang paling mudah coba ini
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"/>
coba ini
Perpustakaan modern terbaik untuk tugas seperti itu menurut saya adalah Picasso by Square. Memungkinkan memuat gambar ke ImageView oleh URL dengan satu-liner:
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
Saya baru-baru ini menemukan utas di sini , karena saya harus melakukan hal serupa untuk tampilan daftar dengan gambar, tetapi prinsipnya sederhana, karena Anda dapat membaca di kelas sampel pertama yang ditunjukkan di sana (oleh jleedev). Anda mendapatkan aliran input gambar (dari web)
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();
}
Kemudian Anda menyimpan gambar sebagai Drawable dan Anda dapat meneruskannya ke ImageView (via setImageDrawable). Sekali lagi dari cuplikan kode atas lihat seluruh utas.
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
Banyak info bagus di sini ... Baru-baru ini saya menemukan kelas bernama SmartImageView yang tampaknya berfungsi sangat baik sejauh ini. Sangat mudah untuk digabungkan dan digunakan.
http://loopj.com/android-smart-image-view/
https://github.com/loopj/android-smart-image-view
UPDATE : Saya akhirnya menulis posting blog tentang ini , jadi periksalah untuk bantuan menggunakan SmartImageView.
PEMBARUAN 2 : Sekarang saya selalu menggunakan Picasso untuk ini (lihat di atas) dan sangat merekomendasikannya. :)
Ini adalah jawaban yang terlambat, seperti yang disarankan di atas AsyncTask
akan dan setelah googling sedikit saya menemukan satu cara lagi untuk masalah ini.
Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");
imageView.setImageDrawable(drawable);
Inilah fungsi lengkapnya:
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();
}
Jangan lupa untuk menambahkan izin berikut di Anda AndroidManifest.xml
untuk mengakses internet.
<uses-permission android:name="android.permission.INTERNET" />
Saya mencoba ini sendiri dan saya belum menghadapi masalah apa pun.
Thread
karena utas UI tidak memungkinkan untuk operasi jaringan.
Ini akan membantu Anda ...
Tetapkan tampilan gambar dan muat gambar ke dalamnya .....
Imageview i = (ImageView) vv.findViewById(R.id.img_country);
i.setImageBitmap(DownloadFullFromUrl(url));
Kemudian Tetapkan metode ini:
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);
Versi dengan penanganan pengecualian dan tugas 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;
}
Cara sederhana dan bersih untuk melakukan ini adalah dengan menggunakan perpustakaan open source Prime .
Bekerja untuk imageView dalam wadah apa pun, seperti tampilan kisi listview, tata letak normal
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 );
Coba dengan cara ini, semoga ini akan membantu Anda untuk menyelesaikan masalah Anda.
Di sini saya menjelaskan tentang cara menggunakan perpustakaan eksternal "AndroidQuery" untuk memuat gambar dari url / server secara asyncTask dengan juga gambar yang dimuat ke cache file perangkat atau area cache.
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 dapat menanganinya untuk Anda dan banyak lagi (seperti cache dan proses pemuatan).
Lihatlah di sini .
Saya pikir adalah pendekatan terbaik.