Come si usa un'immagine a cui fa riferimento l'URL in un ImageView
?
Come si usa un'immagine a cui fa riferimento l'URL in un ImageView
?
Risposte:
Dallo sviluppatore 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);
}
}
Assicurati di avere le seguenti autorizzazioni impostate AndroidManifest.xml
per accedere a Internet.
<uses-permission android:name="android.permission.INTERNET" />
1. Picasso consente il caricamento delle immagini senza problemi nell'applicazione, spesso in una riga di codice!
Usa Gradle:
implementation 'com.squareup.picasso:picasso:2.71828'
Solo una riga di codice!
Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);
2. Glide Una libreria di caricamento delle immagini e memorizzazione nella cache per Android incentrata sullo scorrimento regolare
Usa Gradle:
repositories {
mavenCentral()
google()
}
dependencies {
implementation 'com.github.bumptech.glide:glide:4.7.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
}
// Per una vista semplice:
Glide.with(this).load("http://i.imgur.com/DvpvklR.png").into(imageView);
3. fresco è un potente sistema per la visualizzazione di immagini in applicazioni Android. Fresco si occupa del caricamento e della visualizzazione delle immagini, quindi non è necessario.
Dovrai prima scaricare l'immagine
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;
}
Quindi utilizzare Imageview.setImageBitmap per impostare bitmap in ImageView
Ho scritto un corso per gestirlo, in quanto sembra essere un'esigenza ricorrente nei miei vari progetti:
https://github.com/koush/UrlImageViewHelper
UrlImageViewHelper riempirà un ImageView con un'immagine che si trova in un URL.
L'esempio eseguirà una ricerca di immagini di Google e caricherà / mostrerà i risultati in modo asincrono.
UrlImageViewHelper scaricherà, salverà e memorizzerà nella cache automaticamente tutti gli URL dell'immagine BitmapDrawables. Gli URL duplicati non verranno caricati due volte in memoria. La memoria bitmap viene gestita utilizzando una tabella hash di riferimento debole, quindi non appena l'immagine non verrà più utilizzata da te, verrà automaticamente raccolta automaticamente.
Comunque le persone chiedono il mio commento per pubblicarlo come risposta. sto postando.
URL newurl = new URL(photo_url_str);
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);
La risposta accettata sopra è ottima se stai caricando l'immagine sulla base di un clic sul pulsante, tuttavia se lo stai facendo in una nuova attività, blocca l'interfaccia utente per un secondo o due. Guardandomi intorno ho scoperto che un semplice asincrono ha eliminato questo problema.
Per usare un asincrono aggiungi questa classe alla fine della tua attività:
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);
}
}
E chiama dal tuo metodo onCreate () usando:
new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
.execute(MY_URL_STRING);
Il risultato è un'attività caricata rapidamente e una visualizzazione dell'immagine che viene visualizzata in una frazione di secondo in seguito a seconda della velocità della rete dell'utente.
Puoi anche utilizzare questa visualizzazione LoadingImageView per caricare un'immagine da un URL:
http://blog.blundellapps.com/imageview-with-loading-spinner/
Dopo aver aggiunto il file di classe da quel link è possibile creare un'istanza di una vista immagine URL:
in 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"
/>
Nel codice:
final LoaderImageView image = new LoaderImageView(this, "http://developer.android.com/images/dialog_buttons.png");
E aggiornalo usando:
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;
}
}
Ciao ho il codice più semplice provare questo
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"/>
prova questo
La migliore biblioteca moderna per tale compito secondo me è Picasso di Square. Permette di caricare un'immagine su ImageView tramite URL con una riga:
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
Di recente ho trovato un thread qui , poiché devo fare una cosa simile per una visualizzazione elenco con immagini, ma il principio è semplice, come puoi leggere nella prima classe di esempio mostrata lì (da jleedev). Ottieni il flusso di input dell'immagine (dal 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();
}
Quindi memorizzi l'immagine come Drawable e puoi passarla a ImageView (tramite setImageDrawable). Sempre dallo snippet di codice superiore, dai un'occhiata all'intero thread.
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
Un sacco di buone informazioni qui ... Di recente ho trovato una classe chiamata SmartImageView che sembra funzionare molto bene finora. Molto facile da incorporare e utilizzare.
http://loopj.com/android-smart-image-view/
https://github.com/loopj/android-smart-image-view
AGGIORNAMENTO : Ho finito per scrivere un post sul blog su questo , quindi dai un'occhiata per aiuto sull'uso di SmartImageView.
2 ° AGGIORNAMENTO : ora uso sempre Picasso per questo (vedi sopra) e lo consiglio vivamente. :)
Questa è una risposta tardiva, come suggerito sopra AsyncTask
sarà e dopo aver cercato su Google un po 'ho trovato un altro modo per questo problema.
Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");
imageView.setImageDrawable(drawable);
Ecco la funzione completa:
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();
}
Non dimenticare di aggiungere le seguenti autorizzazioni AndroidManifest.xml
per accedere a Internet.
<uses-permission android:name="android.permission.INTERNET" />
Ho provato questo da solo e non ho ancora riscontrato alcun problema.
Thread
perché il thread dell'interfaccia utente non consente le operazioni di rete.
Questo ti aiuterà ...
Definisci imageview e carica l'immagine in esso .....
Imageview i = (ImageView) vv.findViewById(R.id.img_country);
i.setImageBitmap(DownloadFullFromUrl(url));
Quindi definire questo metodo:
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);
Versione con gestione delle eccezioni e attività asincrona:
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;
}
Un modo semplice e pulito per farlo è usare la libreria open source Prime .
Funziona con imageView in qualsiasi contenitore, come la visualizzazione a griglia di visualizzazione elenco, layout normale
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 );
Prova in questo modo, spero che questo ti aiuti a risolvere il tuo problema.
Qui spiego come utilizzare la libreria esterna "AndroidQuery" per caricare l'immagine da url / server in modo asincrono con anche l'immagine caricata nella cache nel file del dispositivo o nell'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 può gestirlo per te e molto altro (come cache e avanzamento del caricamento).
Dai un'occhiata qui .
Penso che sia l'approccio migliore.