Kricek Posté(e) 11 février 2011 Share Posté(e) 11 février 2011 Coucou tout le monde! J'ai besoin d'un ptit conseil car là, je sèche complètement. Je pense être bien avancé et qu'il me manque juste un petit truc mais je n'arrive pas à savoir quoi. Voilà : Depuis mon appli, je souhaite que l'utilisateur puisse envoyer un mail contenant un fichier généré dans l'appli. Il s'agit d'une appli permettant (entre autres) de créer des devis sous forme de tableau. Ensuite, l'appli génère un fichier html contenant un tableau HTML avec les données entrées. Le fichier est bien créé. Pas de souci. Ensuite, je souhaite que l'utilisateur puisse envoyer ce fichier HTML en pièce jointe d'un mail. Voici un morceau de mon code: Intent envoiMail= new Intent(Intent.ACTION_SEND); envoiMail.setType("text/html"); envoiMail.putExtra(Intent.EXTRA_SUBJECT,"Envoi du prédevis en date du "+date); envoiMail.putExtra(Intent.EXTRA_STREAM,Uri.parse("file://"+fichierPredevisNouveau.getAbsolutePath())); startActivity(envoiMail); Note : mon fichier est généré dans le dossier "/data/data/package_appli/export/fichier.html". Jusque là, pas de souci. J'ai bien le chooser qui s'affiche, me proposant de choisir la manière d'envoyer le mail. Je choisis Gmail, là, toujours pas de souci. Le brouillon de mon mail s'affiche bien, avec la pièce jointe. Et au moment où je l'envois, je vais dans la boite d'envoi et là, la pièce jointe a disparu. Et lors de la réception du mail sur la boite destinataire, la pièce jointe n'y est plus... Une idée? Un conseil? Merci d'avance! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 11 février 2011 Share Posté(e) 11 février 2011 As-tu généré ton fichier avec les droits nécessaires pour qu'il soit accessible par une autre application que la tienne ? (paramètre mode de openFileOutput) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Kricek Posté(e) 11 février 2011 Auteur Share Posté(e) 11 février 2011 As-tu généré ton fichier avec les droits nécessaires pour qu'il soit accessible par une autre application que la tienne ? (paramètre mode de openFileOutput) Euh... Nan... Lol... Je le fais au moment de mon "createNewFile"? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 14 février 2011 Share Posté(e) 14 février 2011 (modifié) Utilise plutôt Context.openFileOutput qui te permettra de positionner les droits d'accès sur le fichier Modifié 14 février 2011 par chpil Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Kricek Posté(e) 15 février 2011 Auteur Share Posté(e) 15 février 2011 Bon, je suis seulement en train d'essayer de bosser là dessus (Week end prolongé oblige... lol) et j'ai un ptit souci: En fait, la méthode openFileOutput renvoit un Stream en écriture... Le souci, c'est que ce fichier, je le crée à la volée (avec un PrintWriter): PrintWriter ecriture = new PrintWriter(new FileWriter(fichierPredevis,true)); ecriture.println("<html>"); ecriture.println("<center>Devis Réalisé le "+date+"<br><br>"); ecriture.println("<table border=\"2\" align=\"center\" width=\"60%\">"); ecriture.println("<tr>"); ecriture.println("<th width=\"10%\">TVA</th>"); ecriture.println("<th width=\"50%\" colspan=\"2\">Description du produit</th>"); ecriture.println("<th width=\"15%\">Prix unitaire HT</th>"); ecriture.println("<th width=\"10%\">Quantité</th>"); ecriture.println("<th width=\"15%\">Prix total HT</th>"); ArrayList<Contenu> liste = OutilsBase.getListeContenusFromProjet(new Projet(date, nom)); for (Contenu c : liste){ ecriture.println("<tr>"); ecriture.println("<td align=\"center\">"+c.getArticle().getTva()+"</td>"); ecriture.println("<td align=\"left\" width=\"40%\">"+c.getArticle().getDescription()+"</td>"); ecriture.println("<td align=\"center\" width=\"10%\">- "+c.getReduc()+" %</td>"); ecriture.println("<td align=\"center\">"+c.getArticle().getPrixUnitaireHT()+" €</td>"); ecriture.println("<td align=\"center\">"+c.getQuantite()+"</td>"); ecriture.println("<td align=\"right\">"+c.getprixTotalHT()+" €</td>"); ecriture.println("</tr>"); } ecriture.println("<tr><td colspan=\"6\"><br></td></tr>"); ecriture.println("<tr>"); ecriture.println("<td></td><td></td>"); ecriture.println("<td colspan=\"2\" align=\"center\">Total sans Remise :<br>"+totaux.getPrixTotalHTSansRemise()+" € HT<br>"+totaux.getPrixTotalTTCSansRemise()+" € TTC<br>TVA: "+totaux.getTvaTotaleSansRemise()+" €</td>"); ecriture.println("<td colspan=\"2\" align=\"center\">Total avec Remise :<br>"+totaux.getPrixTotalHTAvecRemise()+" € HT<br>"+totaux.getPrixTotalTTCAvecRemise()+" € TTC<br>TVA: "+totaux.getTvaTotaleAvecRemise()+" €</td>"); ecriture.println("</tr>"); ecriture.println("</table>"); ecriture.println("</center>"); ecriture.println("</html>"); ecriture.close(); Comment passer d'un PrintWriter à un Stream en écriture? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 15 février 2011 Share Posté(e) 15 février 2011 (modifié) En utilisant le constructeur de PrintWriter qui prend en paramètre un OutputStream OutputStream os = openFileOutput(...); PrintWriter ecriture = new PrintWriter(os); Ensuite, tu utilises ton PrintWriter de la même manière que précédemment Modifié 15 février 2011 par chpil Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Kricek Posté(e) 15 février 2011 Auteur Share Posté(e) 15 février 2011 (modifié) P*tain, je suis trop bête! Je l'ai déjà fait en plus! :D Je vais tester ca tout de suite... Merci encore chpil! Edit : Bon, ca n'a rien changé, en apparence... Lors de la préparation de l'email, la pièce jointe apparait. Une fois le mail envoyé, dans les messages envoyés, elle n'y est plus. A la réception elle n'y est plus non plus... Voici ce que j'ai fait de mon code: fichierPredevisNouveau.createNewFile(); BufferedReader lecture = new BufferedReader(new FileReader(fichierPredevis)); OutputStream os = openFileOutput(fichierPredevisNouveau.getAbsolutePath(), MODE_WORLD_WRITEABLE); PrintWriter ecriture = new PrintWriter(os); Et le code pète à la ligne où j'instancie mon OutputStream: 02-15 11:36:19.394: WARN/System.err(16058): java.lang.IllegalArgumentException: File /data/data/com.monappli.predevis/export/Predevis_Dudule_nouveau.htm contains a path separator 02-15 11:36:19.406: WARN/System.err(16058): at android.app.ContextImpl.makeFilename(ContextImpl.java:1761) 02-15 11:36:19.406: WARN/System.err(16058): at android.app.ContextImpl.openFileOutput(ContextImpl.java:455) 02-15 11:36:19.410: WARN/System.err(16058): at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:158) 02-15 11:36:19.410: WARN/System.err(16058): at com.monappli.predevis.ui.Predevis.generationTexteMail(Predevis.java:174) 02-15 11:36:19.410: WARN/System.err(16058): at com.monappli.predevis.ui.Predevis$4.run(Predevis.java:137) 02-15 11:36:19.410: WARN/System.err(16058): at java.lang.Thread.run(Thread.java:1096) J'ai vu dans la doc, pour openFileOutput: The name of the file to open; can not contain path separators. Euh... Du coup, comment déclarer un nom de fichier, en String, sans préciser son arborescence? :rolleyes: Modifié 15 février 2011 par Kricek Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Kricek Posté(e) 16 février 2011 Auteur Share Posté(e) 16 février 2011 Un ptit up pour la route... :) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 16 février 2011 Share Posté(e) 16 février 2011 openFileOutput crée le fichier dans le répertoire retourné par getFileDir. Tu ne peux pas, visiblement, choisir le répertoire dans lequel ces fichiers seront générés. Mais, si tu veux rendre visibles ces fichiers par d'autres applications, tu n'as pas d'autres choix, à moins de générer tes fichiers sur la SD PS: en utilisant openFileOutput, tu n'as plus besoin d'appeler createNewFile avant Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Kricek Posté(e) 16 février 2011 Auteur Share Posté(e) 16 février 2011 (modifié) Merci encore chpil... Je teste de suite. Edit : Même souci: openFileOutput(getFilesDir()+"Predevis_"+nom+".htm", MODE_WORLD_WRITEABLE); Résultat : java.lang.IllegalArgumentException: File /data/data/Mon_Package/files/Predevis_TataYoyo.htm contains a path separator Edit 2 : J'ai modifié mes arguments en ne mettant que le nom du fichier (et le laisser faire pour le répertoire...) openFileOutput("Predevis_"+nom+".htm", MODE_WORLD_WRITEABLE); Et du coup, je regarde le log et, en épluchant un peu, je tombe sur cette ligne intéressante: ERROR/Gmail(15213): file:// attachment paths must point to file:///mnt/sdcard. Ignoring attachment file:///data/data/Mon_Package/export/Predevis_TataYoyo.htm Ce qui signifierait qu'il n'est possible d'envoyer QUE des pièces jointes provenant de la carte SD? Je teste avec un mail classique... Edit 3 : Bon, pour info, cela SEMBLE fonctionner. Mais pas sur Gmail. A chaque fois que je tente d'envoyer ma pièce jointe par Gmail, il me met une erreur et le fichier ne part pas. Il semblerait que l'envoi de pièces jointes par Gmail ne soit possible que si la pièce jointe se trouve sur la carte SD....... Du coup, question: Quid des gens qui n'ont pas de carte SD dans leur bouzin?? Modifié 16 février 2011 par Kricek Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
dugh Posté(e) 3 mai 2011 Share Posté(e) 3 mai 2011 Bonjour, Il semblerait que les applications soient dans un "bac à sable", cad qu'elles ne peuvent accéder qu'à leur petit espace réservé. Ainsi, lorsque l'on sauvegarde un fichier, c'est uniquement dans son petit espace. Et par conséquent, l'application e-mail ne peut y accéder. Visiblement, toutes les applis ont le droit d'accéder à la carte SD, c'est pour cela que ça fonctionne de sauver la pièce jointe sur la carte SD (quand il y en a une) et de l'envoyer par e-mail. Du coup, la question est: il y a t il un répertoire interne (pas sur la sd) commun accessible à toutes les applis? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
dugh Posté(e) 4 mai 2011 Share Posté(e) 4 mai 2011 J'ai finalement trouvé! Il faut mettre fOut = openFileOutput(fileName, MODE_WORLD_READABLE); fOut.write(texte.getBytes()); fOut.close(); Puis au moment de l'envoi: sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+getFilesDir()+"/"+fileName)); Et ça marche super! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chkeff Posté(e) 17 mai 2011 Share Posté(e) 17 mai 2011 J'ai le même problème que toi ! En fait ta solution fonctionne avec l'émulateur mais quand je test avec mon samsung galaxy teos j'ai le ùêùe soucis à savoir que le fichier joint est présent quand j'envoi le mmail mais à la réception je ne l'ai pas ! Je me permet donc de remonter ce sujet pour demande de l'aide ! Merci d'avance ! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
pinguipacman Posté(e) 19 janvier 2016 Share Posté(e) 19 janvier 2016 Bonjour, Ce sujet est ancien mais je rencontre également le même problème sur un galaxy note 4 et non sur les autres téléphones. J'utilise cette fonction : startActivity(Intent.createChooser(new Intent(Intent.ACTION_SEND).putExtra(Intent.EXTRA_STREAM,shareUri).setType("image/png").putExtra("sms_body", Msg), "")); et j'ai essayé d'initialiser sharUri avec plusieurs méthodes : Uri.parse comme cité ci-dessus, méthode avec MediaStore mais j'obtient toutjous le message : "impossible de joindre le fichier". Avez-vous une idée? merci Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
gob0 Posté(e) 20 janvier 2016 Share Posté(e) 20 janvier 2016 Salut, 1- est-ce que le fichier est présent sur le téléphone? 2- si oui, dans quel dossier (chemin complet)? 3- qu'as-tu mis dans "shareUri"? Et sinon, joli coup de godet :P ^_^ Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.