Aller au contenu

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);
 }
   });
}

Lien vers le commentaire
Partager sur d’autres 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.

Modifié par Vicnet31
Lien vers le commentaire
Partager sur d’autres 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); ?

Lien vers le commentaire
Partager sur d’autres 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 !

Lien vers le commentaire
Partager sur d’autres sites

  • 4 weeks later...

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

Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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:

Modifié par cp777
Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...