Jump to content
Sign in to follow this  
Driel

Récupération et affichage dynamique d'image (string?)

Recommended Posts

Bonjour,

J'ai un petit problème. Actuellement je développe une application test sur android (un catalogue de produit).

De fait, je génère une liste des top 10 des produits vendus, que je récupère via un webService et Json. Jusque là, pas de problème, tout fonctionne à merveille.

Le pépin, c'est que dans ma listView j'ai un imageView, où j'aimerais afficher l'image de chaque produit, en sachant que cette image est récupérée via une servlet sur un serveur distant et en fonction de l'id du produit.

Alors, écrire le lien, c'est ok. Mais le truc c'est envoyer le lien (avec l'appel à la servlet dedans), récupérer l'image et la "convertir" en String, de manière à pouvoir la stocker dans une hashmap<String, String> dont je me sers pour générer le contenu de la listView.

Ci joint mon activity bestSales

(la fonction retrieveStream est une fonction décrite ailleurs dans la classe, mais n'est pas essentiel ici, en gros elle sert à demander les infos au serveur)

La partie appel à la servlet et là où je bloque sont en dessous des commentaires

public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.best_sales);
 mBestSales = (ListView) findViewById(R.id.listViewBS);
 mUrl = mUrl + "/produit/top";
 InputStream lSource = retrieveStream(mUrl);
 Gson lGon = new Gson();
 Reader lReader = new InputStreamReader(lSource);
 TopProduit[] lListeProduits = lGon
   .fromJson(lReader, TopProduit[].class);
 ArrayList<HashMap<String, String>> lListItems = new ArrayList<HashMap<String, String>>();
 HashMap<String, String> map;
 for (TopProduit lProduit : lListeProduits) {
  map = new HashMap<String, String>();
  map.put("id", lProduit.getProduit().getId().toString());
  map.put("titre", lProduit.getProduit().getTitle());
  map.put("compo", lProduit.getProduit().getComposition().getNom());
// Ici, appel à ma Servlet, je l'ai testée, elle est fonctionnelle quand je met le lien en dur dans le navigateur
// le résultat doit être mis dans ma hashmap, juste....
  String lUrlImage = "http://monUrl/MaServlet?id_produit="
 + lProduit.getProduit().getId()
 + "&fichier=IMAGE_PRINCIPALE";
//..... ici, je dois mettre l'image au format string
  map.put("img", String.valueOf(lUrlImage));
  lListItems.add(map);
 }
 SimpleAdapter mSchedule = new SimpleAdapter(this.getBaseContext(),
   lListItems, R.layout.best_sales_item, new String[] { "img",
  "titre", "compo" }, new int[] { R.id.imgBS,
  R.id.titreBS, R.id.compoBS });
 mBestSales.setAdapter(mSchedule);
 mBestSales
   .setOnItemClickListener(new AdapterView.OnItemClickListener() {
 @Override
 @SuppressWarnings("unchecked")
 public void onItemClick(AdapterView<?> a, View v,
   int position, long id) {
  // on récupère la HashMap contenant les infos de notre
  // item (titre, description, img)
  HashMap<String, String> map = (HashMap<String, String>) mBestSales
    .getItemAtPosition(position);
  // on créer une boite de dialogue
  Bundle lBundle = new Bundle();
  lBundle.putString("id", map.get("id"));
  Intent lIntent = new Intent(BestSalesActivity.this,
    ProduitByIdActivity.class);
  lIntent.putExtras(lBundle);
  startActivityForResult(lIntent, CODE_DE_MON_ACTIVITE);
 }
   });
}

Share this post


Link to post
Share on other sites

Salut,

J'ai trouvé ce code sur le net qui semble correspondre à ce que tu veux, non ?

URLConnection connection = uri.toURL().openConnection();
connection.connect();
InputStream is = connection.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is, 8 * 1024);
Bitmap bmp = BitmapFactory.decodeStream(bis);
bis.close();
is.close();

Ce que te sort le inputstream, ou plutot un InputStreamReader est à placer dans ta map.

Edited by Vicnet31

Share this post


Link to post
Share on other sites

ça a l'air pas mal, j'ai essayé pas mal de truc déjà donc je prend un peu ce qui vient ^^

Merci de ta réponse en tout cas :)

Par contre, que signifie 8 * 1024 là dedans BufferedInputStream bis = new BufferedInputStream(is, 8 * 1024); ?

Share this post


Link to post
Share on other sites

Salut,

A priori, c'est specifique à l'appli dans laquelle j'ai récupéré le code, du style fichier image de 1024 pixels en 8 couleurs ?!?

Ou quelque chose comme cela.

Le BufferedInputStream comme son nom l'indique, utilise un buffer tampon pour lire les données, ce qui limite les accès disques/reseaux. Tu peux mettre ce que tu veux pour cette valeur sachant que plus c'est grand, plus c'est rapide mais plus tu consomes de la mémoire...

Si la taille des données dépassent celle du buffer, au moment du read le inputStream videra le buffer et le recharera en faisant un acces disque/reseau. Donc pas de pb de taille min !

Share this post


Link to post
Share on other sites

Merci beaucoup pour ton aide et tes explications, et désolé pour ma réponse tardive. j'essaierai ça dans la semaine et ferai part des retours

Share this post


Link to post
Share on other sites

Tardivement, mais voici mon report par rapport au problème que j'ai posé sur ce sujet.

Le morceau de code donné plus haut ne fonctionnant pas, j'ai donc continué mes recherches (sur le Web et dans mon coin) et j'ai trouvé une solution qui fonctionne.

Rappelez-vous, je cherchais à télécharger mes images depuis un serveur distant et à les ajouter dynamiquement dans une hashmap, puis à convertir cette hashmap de manière à la caser à dans un listView (c'est un peu pèle-mêle comme explication, mais cf mon code au début du topic)

Voici le morceau de code m'ayant aidé

public static String loadImageFromWebOperations(String url, String path) {
 try {
  InputStream is = (InputStream) new URL(url).getContent();
  System.out.println(path);
  File f = new File(path);
  if (!f.exists()) {
f.createNewFile();
FileOutputStream fos = new FileOutputStream(f);
try {
 byte[] b = new byte[100];
 int l = 0;
 while ((l = is.read(B)) != -1)
  fos.write(b, 0, l);
} catch (Exception e) {
 e.printStackTrace();
}
  }
  return f.getAbsolutePath();
 } catch (Exception e) {
  System.out.println("Exc=" + e);
  return null;
 }
}

Lors du parcours de ma liste de produit, au moment où je dois récupérer l'image, je fait appel à cette méthode. Les paramètres url et path sont spécifié lors de l'appel, l'url étant l'adresse web de l'image sur le serveur et le path étant le chemin où le fichier image sera stocké sur la sd (oui, j'ai aussi ajouté une sd et les autorisation qui vont avec(Write external storage))

Je récupère l'url, instancie une variable de type file puis vérifie son existence de manière à éviter de télécharger les images déjà existantes. Je ne peux pas expliquer le traitement ensuite mais je retourne une variable de type string comprenant le chemin du fichier (par exemple: \sdcard\produit\54, où 54 est l'id de mon produit, ce qui me permet de pas mélanger les images). Je retourne le chemin puisque ceci sera stocké dans ma hashmap puis attribué à un imageView qui est un composant n'acceptant que les string, il s'occupera donc de résoudre le chemin vers l'image lui même.

Voilà, si quelqu'un à une idée rapport au redimensionnement de l'image à la volée, ça serait un petit plus non négligeable !

En attendant, et je poursuis mes recherches sur ça aussi, merci pour l'aide apportée Vicnet31

Share this post


Link to post
Share on other sites

Pour le redimensionnement de l'image dans mon listView, j'ai trouvé comme faire, je laisse ici, peut-être que ça aidera quelqu'un.

En fait, dans l'imageView où l'on va mettre l'image, il faut ajouter les valeurs ci dessous

android:adjustViewBounds="true"
    android:maxHeight="90px"

Bien entendu, le maxHeight peut être différent et on peut très bien ne pas le mettre et le remplacer par autre chose

Voilà, en espérant que ça servira à d'autres

Share this post


Link to post
Share on other sites

Il est parfois interessant de voir comment les professionnels travaillent dans cette direction notamment avec le digital signage. Pour moi en effet il est intéressant de voir quels sont leurs projets et comment il le mettent à bien. Et pourquoi pas même les contacter afin d'obtenir d'avantages de détails et d'informations... Ils publient souvent une liste de leurs clients, de leurs projets et cela peut être très utile pour une étude de cas. :lol:

Edited by cp777

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  





×
×
  • Create New...