IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Impossible de charger une img depuis le stokage interne


Sujet :

Android

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut Impossible de charger une img depuis le stokage interne
    Bonjour tout le monde,

    J'ai un petit soucis embêtant...

    Je sauve une image dans un dossier de mon appli, et elle est bien sauvé la où je veux.

    Mais après je veux l'afficher dans un webView, mais là elle ne veut pas s'afficher....

    Alors je sais l'afficher si je prends une url extérieur ou si elle se trouve dans le dossier assets(Mais on ne peut pas sauvegarder dans ce dossier).

    Il n'affiche rien et il ne met pas le dessin '?' pour dire que l'image n'a pas été trouvé.

    Mon dossier dans laquelle je les mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/" + "exemple.png"
    Ce qui représente par exemple sur mon tel. : /storage/sdcard0/android/data/com.example.myproject/files/pictures.


    Mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    this.webViewMain = (WebView)this.findViewById(R.id.webViewMain);
     
    		this.loadFileTemplate(); 
     
    		File imgFile = new  File(this.getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/" + "example.png");
     
    		if(imgFile.exists()){
    			Toast.makeText(this, "file//" + this.getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/" + "exemple.png", Toast.LENGTH_LONG).show();
    		}
     
    		String src = "<img src=\"file//" + this.getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/" + "example.png" + "\" width=\"100%\" height=\"100%\" />";
     
    		String template = this.templateMain.replace("##DATAINFORMATION##", src);
     
     
    		this.webViewMain.loadData(template, "text/html; charset=UTF-8", null);
    		this.webViewMain.reload();
    J'ai essayé un peu tout ce que j'ai trouvé sur le net, comme ici avec "file//"...

    Est-ce que quelqu'un a une idée? Je ne pense pas que c'est une permission pour ma part...

    Merci à vous,

    Cordialement,

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 141
    Points : 177
    Points
    177
    Par défaut
    J'avais utilisé un ContentProvider pour y venir à bout, mais depuis la 4.4 ça ne fonctionne plus.

    Les images doivent être dans les assets sinon pas de salut.

    Du coup j'ai abandonné l'utilisation de la WebView.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    Bon ben merci d'avoir été cash avec moi ^^'.

    Alors, j'ai un rien de chance car j'ai que le problème avec un template, où je dois montrer entièrement une image venu de l'extérieur sans texte autours, les autres templates c'est moi qu'il les fixes donc je mets dans assets.

    Alors est-ce la bonne pratique de jouer avec un webview et imageView. Et mettre un invisible, visible et ainsi de suite?

    Sinon je laisse un peu ouvert au cas où quelqu'un a trouvé une magoulle ^^.


    Merci à toi.

  4. #4
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Tu ne demandes pas le bon fichier.

    Sur ta sauvegarde, tu sauves exemple.png. Dans ta webview, tu demandes example.png.

    Après, ne jouant quasi-jamais avec les Webview (et celle de Kitkat changeant de moteur, justement...), je ne peux rien dire sur les dires d'UbuntuMan.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par Hizin Voir le message
    Tu ne demandes pas le bon fichier.

    Sur ta sauvegarde, tu sauves exemple.png. Dans ta webview, tu demandes example.png.

    Après, ne jouant quasi-jamais avec les Webview (et celle de Kitkat changeant de moteur, justement...), je ne peux rien dire sur les dires d'UbuntuMan.
    Lol rien avoir hélas ^^. J'ai juste mis exemple.png comme exemple :p. Et il trouve bien le(s) fichier(s) que j'utilise existe, mais ne l'affiche pas. Je vérifie avant envoie.

  6. #6
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Ok.
    Au vu des codes qu'on voit, c'était une possibilité, donc je suis out, ne jouant jamais avec les Webviews.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    Pas de soucis ^^.

    J'aurais préféré ce soucis là aussi ^^.

    Sinon dans une même activity, est-ce que c'est conseillé de jouer avec un webview et un imageView et de rendre invisible un et puis l'autre?

  8. #8
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Ca va dépendre de ton besoin.
    Ca pourrait être un hack tolérable.

    Pourquoi as-tu besoin d'une webview ? La réponse à ta question va dépendre de ça.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    J'utilise des templates selon ce que je charge dans un webservice et je les fais défiler. Pour la pluspart, cest le chargement d'une image qui est afficher entièrement, donc je passerai par un imageView et les autres les images sont fixes, donc je peux les mettre dans le dossier asset.

    Je sauvegarde les images dans l'application au cas où le webservice est injoingnable... Mais c'est une perte de temps faut croire vu qu'on ne peut atteindre les images dans les dossiers de l'appli et les mettres das un webwiew. XD.

  10. #10
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Un moyen de contourner ce problème serait de faire une extraction de ton image en Base64 et de l'afficher ensuite dans une balise img...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="data:image/jpg;base64,xxxxxxxxxxxxxxxxxxxxxxxxxxxx"/>
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 141
    Points : 177
    Points
    177
    Par défaut
    Suis curieux de voir la conso mémoire de cette approche (overhead + taille du doc).

    Mais effectivement c'est mis en avant dans des solutions que j'avais vu ().

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    Alor cela fontionne mais ca à l air très capricieux.... je mettrai ce soir ou demain matin les fonctions utilisées .

  13. #13
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Citation Envoyé par UbuntuMan Voir le message
    Suis curieux de voir la conso mémoire de cette approche (overhead + taille du doc).

    Mais effectivement c'est mis en avant dans des solutions que j'avais vu ().
    Je l'ai déjà utilisé pour des images "simples" il y a 2 ans. Ca fonctionnait bien (pas de problème de mémoire soulevé), mais pas utilisé depuis, et pas mis au ban de test depuis non plus.
    Je suis curieux aussi
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  14. #14
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    Bonjour,

    Alors pour l'instand, j'ai des réactions bizares XD.

    Si je teste mes fonctions (voir en-dessous) dans une simple activity, bien tranquillement, pas de soucis cela fonctionne....

    Mais pour mon projet, je lance une boucle qui permet de charger un template variant selon les données que je réccupère (Cela peut être une image entière ou des des infoirmations que je place dans un template défini). Une fois un template chargé, je mets un Thread.sleep(n). Quand j'utilise mes fonctions dans cette boucle, c'est out, sauf en débugeant comme ci il lui fallait du temps pour faire ce qu'il a faire... XD.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    public File createFileFromInputStream(String imageAsset) {
     
    		File tempory = new File(this.activity.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS) + "/" + imageAsset);
    		if(tempory.exists()) return tempory;
    	   try{		   
     
    		   AssetManager am = this.activity.getResources().getAssets();
    		   InputStream inputStream = am.open("image/" + imageAsset);
     
    	      try {
     
    				InputStream input = inputStream;
    				OutputStream output = new FileOutputStream (this.activity.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS) + "/" + imageAsset);
    				try {
    				    byte[] buffer = new byte[200000];
    				    int bytesRead = 0;
    				    while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) {
    				        output.write(buffer, 0, bytesRead);
    				    }
    				} finally {
    				    output.close();
    				    input.close();
    				}
    				return tempory;
    			} catch (Exception e) {
    				Log.e("File Load","create file",e);
    				return null;
    			}
    	   }catch (Exception e) {
    		   Log.e("FileFactory","CreateFileFromInputStream",e);
    		   return null;
    	   }
    	}
     
    	public String getImgInBase64(File image){
     
     
    		 byte[] imageRaw = null;
    		try{
    			if(!image.exists()){
    				return null;
    			}
    		}catch(Exception e){
    			return null;
    		}
    		try{
    			File file = image;
    			InputStream in = new BufferedInputStream(new FileInputStream(file));
    	        ByteArrayOutputStream out = new ByteArrayOutputStream();
    	        int c;
    	        while ((c = in.read()) != -1)
    	        {
    	            out.write(c);
    	        }
    	        out.flush();
     
    	        imageRaw = out.toByteArray();
     
    	        in.close();
    	        out.close();
    	    } catch (IOException e)
    	    {
    	        Log.e("FileFactory","getBase64",e);
    	        return null;
    	    }
     
    		return Base64.encodeToString(imageRaw, Base64.DEFAULT);
     
    	}

    PS: Voilà ca tourne avec cette méthode .

    J'ai rajouté un Thread.speed(200) entre les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                             this.webViewMain.loadData(template, "text/html; charset=UTF-8",null);
     
    			Thread.sleep(200);			
     
    			this.webViewMain.reload();
    			Thread.sleep(200);
    webViewMain est un WebView. Quand on essaye de passer une trop grande chaîne de caractère, il n'a pas le de charger et de se faire un refresh. Je parle de chaîne de +-300 000 caractères à cause des images.

    Maintenant ça tourne, mais je conseillerai de prendre les plus petites résolutions possibles pour les images ou de passer par une url XD.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Charger une image depuis un textfield [noob]
    Par yodark dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 21/04/2006, 08h36
  2. Charger une page depuis la mémoire dans un TWebBrowser
    Par dableuf dans le forum Composants VCL
    Réponses: 1
    Dernier message: 16/01/2006, 15h46
  3. Charger une page depuis un menu déroulant ?
    Par tomguiss dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 14/10/2005, 08h32
  4. [Applet][JAR]Charger une applet depuis un fichier jar
    Par CappCorp dans le forum Applets
    Réponses: 8
    Dernier message: 23/11/2004, 13h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo