61 votes

Android - image locale dans une vue web

J'essaie d'afficher une image locale dans ma vue Web :

 String data = "<body>" + "<img src=\"file:///android_asset/large_image.png\"/></body>";
 webview.loadData(data, "text/html", "UTF-8");

Ce code n'affiche rien, au lieu de :

 webview.loadUrl("file:///android_asset/large_image.jpg");

Celui-ci fonctionne, mais j'ai besoin d'une page web complexe, pas seulement d'une image.

Des idées ?

0 votes

Il est préférable de créer un fichier html et de le placer dans le dossier des actifs et d'y accéder depuis le dossier des actifs.

70voto

Sanjay Patel Points 712

Chargez le fichier Html dans Webview et mettez votre image dans le dossier asset et lisez ce fichier image en utilisant Html.

<html>
  <table>
    <tr>
      <td>
        <img src="abc.gif" width="50px" alt="Hello">
      </td>
    </tr>
  </table>
</html>

Maintenant, chargez ce fichier Html dans Webview.

webview.loadUrl("file:///android_asset/abc.html");

11 votes

Que faire si l'image se trouve dans un autre dossier de l'actif ?

1 votes

Étonnamment, cela fonctionne aussi pour votre application en version release.

0 votes

L'image .jpg est incapable de se charger, y a-t-il une autre meilleure solution ?

51voto

Zain Ali Points 3813

Vous pouvez également essayer

String data = "<body>" + "<img src=\"large_image.png\"/></body>";

webView.loadDataWithBaseURL("file:///android_asset/",data , "text/html", "utf-8",null);

0 votes

Je pense que c'est la méthode la plus rapide, surtout si vous n'avez besoin que d'afficher une seule image. Merci.)

0 votes

Je génère des fichiers html en utilisant du code et j'avais besoin d'utiliser des images locales dans le dossier des actifs. J'ai essayé d'autres méthodes, mais elles n'ont pas fonctionné. La vôtre fonctionne parfaitement.

28voto

noxo Points 307

Un moyen pratique (souvent oublié) consiste à utiliser des images intégrées en base64 dans le contenu HTML. Cela fonctionnera également sur les navigateurs Webkit mobiles (IOS, Android..).

L'intérêt de cette méthode est qu'elle permet d'intégrer des images dans le contenu HTML, au lieu de se battre avec des liens d'image entre la vue Web et le système de fichiers restreint.

  <img src="data:image/jpg;base64,xxxxxxxxxxxxxxxxxxxxxxxxxxxx"/>

  xxxxx = base64 encoded string of images bytes

Si vous voulez fournir des données d'image (intégrées en base64) à partir du système de fichiers, vous pouvez par exemple :

1) Dans Android, utilisez ContentProvider, qui fournira des chaînes d'images formatées en base64.

<img src="content://.............."/>

2) Ou vous pouvez prétraiter le HTML avec JSOUP ou un analyseur DOM similaire (avant de le mettre en webview) et ajuster l'image src avec une image correctement encodée en base64.

Les inconvénients de cette méthode sont les frais généraux liés à la conversion de l'image en chaîne base64 et, bien sûr, à la transmission de données HTML plus volumineuses à la vue Web.

2 votes

Bonjour, pouvez-vous donner un exemple avec cette ligne complète : <img src="content://.............."/>

0 votes

Cette technique n'est utile que si le WebView dispose de loadDataWithBaseURl` où l'URL de base n'est pas file://... .

8voto

Viren Savaliya Points 398

Utilisez cette méthode.

mview.loadDataWithBaseURL(folder.getAbsolutePath(), content, "text/html", "windows-1252", "");

folder.getAbsolutePath() peut être "file:///android_asset" ou simplement "/"

1 votes

Quel est le contenu ici ?

0 votes

Le contenu est du texte html réel comme <html> ... </html>

2voto

Tanmay Mandal Points 13341

Je pense qu'il y a \ manquant dans votre code

   String data = "<body>" + "<img src=\\"file:///android_asset/large_image.png\"/></body>";

1 votes

Avec deux "\", eclipse ne veut pas compiler :s J'ai trouvé une solution de contournement : webview.loadDataWithBaseURL("fake://w/t/f", data, mimeType, encoding, null) ; Il semble que loadData() soit buggué ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X