Comment utilisez-vous une image référencée par URL dans un ImageView
?
Comment utilisez-vous une image référencée par URL dans un ImageView
?
Réponses:
Du développeur 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);
}
}
Assurez-vous que vous disposez des autorisations suivantes AndroidManifest.xml
pour accéder à Internet.
<uses-permission android:name="android.permission.INTERNET" />
1. Picasso permet un chargement d'image sans tracas dans votre application, souvent sur une seule ligne de code!
Utilisez Gradle:
implementation 'com.squareup.picasso:picasso:2.71828'
Une seule ligne de code!
Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);
2. Glide Une bibliothèque de chargement et de mise en cache d'images pour Android axée sur un défilement fluide
Utilisez Gradle:
repositories {
mavenCentral()
google()
}
dependencies {
implementation 'com.github.bumptech.glide:glide:4.7.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
}
// Pour une vue simple:
Glide.with(this).load("http://i.imgur.com/DvpvklR.png").into(imageView);
3. fresco est un système puissant pour afficher des images dans des applications Android.
Vous devrez d'abord télécharger l'image
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;
}
Utilisez ensuite Imageview.setImageBitmap pour définir le bitmap dans ImageView
J'ai écrit une classe pour gérer cela, car cela semble être un besoin récurrent dans mes différents projets:
https://github.com/koush/UrlImageViewHelper
UrlImageViewHelper remplira une ImageView avec une image qui se trouve à une URL.
L'échantillon effectuera une recherche d'images Google et chargera / affichera les résultats de manière asynchrone.
UrlImageViewHelper téléchargera, enregistrera et mettra en cache automatiquement toutes les URL d'image des BitmapDrawables. Les URL en double ne seront pas chargées en mémoire deux fois. La mémoire bitmap est gérée à l'aide d'une table de hachage de référence faible, donc dès que l'image n'est plus utilisée par vous, elle sera automatiquement récupérée.
Quoi qu'il en soit, les gens demandent mon commentaire pour le poster comme réponse. je poste.
URL newurl = new URL(photo_url_str);
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);
La réponse acceptée ci-dessus est excellente si vous chargez l'image sur la base d'un clic sur un bouton, mais si vous le faites dans une nouvelle activité, elle fige l'interface utilisateur pendant une seconde ou deux. En regardant autour de moi, j'ai constaté qu'une simple asynctask a éliminé ce problème.
Pour utiliser un asynctask, ajoutez cette classe à la fin de votre activité:
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);
}
}
Et appelez à partir de votre méthode onCreate () en utilisant:
new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
.execute(MY_URL_STRING);
Le résultat est une activité rapidement chargée et une vue d'image qui apparaît une fraction de seconde plus tard en fonction de la vitesse du réseau de l'utilisateur.
Vous pouvez également utiliser cette vue LoadingImageView pour charger une image à partir d'une URL:
http://blog.blundellapps.com/imageview-with-loading-spinner/
Une fois que vous avez ajouté le fichier de classe à partir de ce lien, vous pouvez instancier une vue d'image d'URL:
en 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"
/>
Dans du code:
final LoaderImageView image = new LoaderImageView(this, "http://developer.android.com/images/dialog_buttons.png");
Et mettez-le à jour en utilisant:
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;
}
}
Salut, j'ai le code le plus simple, essayez ceci
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"/>
essaye ça
À mon avis, la meilleure bibliothèque moderne pour une telle tâche est Picasso by Square. Il permet de charger une image dans une ImageView par URL avec un liner:
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
J'ai récemment trouvé un fil ici , car je dois faire une chose similaire pour une liste avec des images, mais le principe est simple, comme vous pouvez le lire dans le premier exemple de classe montré ici (par jleedev). Vous obtenez le flux d'entrée de l'image (à partir du 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();
}
Ensuite, vous stockez l'image en tant que dessinable et vous pouvez la transmettre à ImageView (via setImageDrawable). Encore une fois à partir de l'extrait de code supérieur, jetez un œil à l'ensemble du thread.
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
Beaucoup de bonnes informations ici ... J'ai récemment trouvé une classe appelée SmartImageView qui semble fonctionner très bien jusqu'à présent. Très facile à intégrer et à utiliser.
http://loopj.com/android-smart-image-view/
https://github.com/loopj/android-smart-image-view
MISE À JOUR : J'ai fini par écrire un article de blog à ce sujet , alors consultez-le pour obtenir de l'aide sur l'utilisation de SmartImageView.
2ÈME MISE À JOUR : J'utilise maintenant toujours Picasso pour cela (voir ci-dessus) et je le recommande fortement. :)
Ceci est une réponse tardive, comme suggéré ci AsyncTask
- dessus et après avoir googlé un peu, j'ai trouvé un autre moyen de résoudre ce problème.
Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");
imageView.setImageDrawable(drawable);
Voici la fonction complète:
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();
}
N'oubliez pas d'ajouter les autorisations suivantes dans votre AndroidManifest.xml
pour accéder à Internet.
<uses-permission android:name="android.permission.INTERNET" />
J'ai essayé moi-même et je n'ai pas encore rencontré de problème.
Thread
car le thread d'interface utilisateur ne permet pas les opérations réseau.
Cela vous aidera ...
Définissez l'imageview et chargez l'image dedans .....
Imageview i = (ImageView) vv.findViewById(R.id.img_country);
i.setImageBitmap(DownloadFullFromUrl(url));
Définissez ensuite cette méthode:
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);
Version avec gestion des exceptions et tâche asynchrone:
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 moyen simple et propre de le faire est d'utiliser la bibliothèque open source Prime .
Travailler pour imageView dans n'importe quel conteneur, comme la vue de la liste de la grille, la mise en page 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 );
Essayez de cette façon, j'espère que cela vous aidera à résoudre votre problème.
Ici, j'explique comment utiliser la bibliothèque externe "AndroidQuery" pour charger l'image de l'url / serveur de manière asyncTask avec également une image chargée dans le fichier de périphérique ou la zone de 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 peut gérer cela pour vous et bien plus encore (comme la mise en cache et la progression du chargement).
Jetez un oeil ici .
Je pense que c'est la meilleure approche.