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 :

Augmenter la mémoire allouée à une application


Sujet :

Android

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Augmenter la mémoire allouée à une application
    Bonjours après maintes recherches je viens m'adresser à vous.
    J'essaie d'afficher des images prises par l'appareil photo et de les afficher dans l'application. Quand je prends des images basse résolution (disons 100kB de taille), je n'ai pas de problèmes à les passer en bitmap pour l'affichage, par contre dès que je les prends en haute résolution(1.5MB), l'application plante avec l'exception Error java.lang.OutOfMemoryError. ça arrive soit sur mes smartphones(Samsung Galaxy SII,Samsung Galaxy SIII) soit sur toutes les tablettes.
    Pour l'instant j'ai résolu en baissant manuellement la qualité et la taille des photos mais, vue l'évolution des appareils photo avec toujours plus de résolution, ce problème risque de se présenter de plus en plus souvent.
    Y a-t-il pas une solution permanente pour augmenter la mémoire allouée à mon Application par Android sans devoir intervenir manuellement sur l'appareil et dans le code?


    Les images sont stockées sous format Bitmap
    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
     
    //creation de l'image
    Uri domuri1
     
    ContentValues cv = new ContentValues();
    		cv.remove("101");
    		domuri1 = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, cv);
    File domthumb1 = new File(domuri1.toString(), fileName1);
     
    //mise en place de la séléction de l'image
    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");		
    intent.putExtra(MediaStore.EXTRA_OUTPUT, domuri1);
    startActivityForResult(intent, 100);
     
    //enregistrement des images
    ContentResolver cr = getContentResolver();
    bitmap1 = MediaStore.Images.Media.getBitmap(cr, domuri1 );
    imageView.setImageBitmap(bitmap1);
    Merci.

  2. #2
    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
    Quel est le message pour le OOM ?
    Quelle est ta heap size à ce moment ?
    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

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    qu'es ce donc que le OOM? le logCat?
    si c'est ça voici le message d'erreur complet
    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
     
    07-19 11:17:30.515: E/AndroidRuntime(13046): FATAL EXCEPTION: main
    07-19 11:17:30.515: E/AndroidRuntime(13046): java.lang.OutOfMemoryError
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:643)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at android.provider.MediaStore$Images$Media.getBitmap(MediaStore.java:727)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at Class.onActivityResult(P12.java:668)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at android.app.Activity.dispatchActivityResult(Activity.java:4746)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at android.app.ActivityThread.deliverResults(ActivityThread.java:2990)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at android.app.ActivityThread.handleSendResult(ActivityThread.java:3037)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at android.app.ActivityThread.access$1100(ActivityThread.java:128)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1191)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at android.os.Looper.loop(Looper.java:137)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at android.app.ActivityThread.main(ActivityThread.java:4514)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at java.lang.reflect.Method.invokeNative(Native Method)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at java.lang.reflect.Method.invoke(Method.java:511)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
    07-19 11:17:30.515: E/AndroidRuntime(13046): 	at dalvik.system.NativeStart.main(Native Method)
    Pour répondre à ta seconde question voici les chiffre que j'obtient avec ces fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Log.i("debug","freeMemoryAllowed:"+Runtime.getRuntime().freeMemory());
    			Log.i("debug","maxMemoryAllowed:"+Runtime.getRuntime().maxMemory());
    			Log.i("debug","totalMemoryAllowed:"+Runtime.getRuntime().totalMemory());
    07-19 11:32:15.215: I/debug(14404): freeMemoryAllowed:2185368
    07-19 11:32:15.215: I/debug(14404): maxMemoryAllowed:67108864
    07-19 11:32:15.215: I/debug(14404): totalMemoryAllowed:62857184

  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
    Merci pour l'exception.
    Peux-tu mettre aussi le message juste avant ? Il ressemble à quelque chose "tried to allocate 33,246 Mb to ...", un log de niveau "info" ou "verbose" de mémoire.
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    EDIT:je n'ai pas un tel message. J'ai ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    07-19 11:52:05.110: I/dalvikvm(15482):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    07-19 11:52:05.105: I/dalvikvm(15482): "main" prio=5 tid=1 RUNNABLE
    puis ceci
    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
     
    07-19 11:52:05.105: I/dalvikvm(15482):   | schedstat=( 4478352079 721496049 3864 ) utm=374 stm=73 core=2
    07-19 11:52:05.105: I/dalvikvm(15482):   at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
    07-19 11:52:05.105: I/dalvikvm(15482):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
    07-19 11:52:05.105: I/dalvikvm(15482):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:643)
    07-19 11:52:05.105: I/dalvikvm(15482):   at android.provider.MediaStore$Images$Media.getBitmap(MediaStore.java:727)
    07-19 11:52:05.105: I/dalvikvm(15482):   at .onActivityResult(P12.java:673)
    07-19 11:52:05.105: I/dalvikvm(15482):   at android.app.Activity.dispatchActivityResult(Activity.java:4746)
    07-19 11:52:05.105: I/dalvikvm(15482):   at android.app.ActivityThread.deliverResults(ActivityThread.java:2990)
    07-19 11:52:05.105: I/dalvikvm(15482):   at android.app.ActivityThread.handleSendResult(ActivityThread.java:3037)
    07-19 11:52:05.105: I/dalvikvm(15482):   at android.app.ActivityThread.access$1100(ActivityThread.java:128)
    07-19 11:52:05.105: I/dalvikvm(15482):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1191)
    07-19 11:52:05.105: I/dalvikvm(15482):   at android.os.Handler.dispatchMessage(Handler.java:99)
    07-19 11:52:05.105: I/dalvikvm(15482):   at android.os.Looper.loop(Looper.java:137)
    07-19 11:52:05.105: I/dalvikvm(15482):   at android.app.ActivityThread.main(ActivityThread.java:4514)
    07-19 11:52:05.105: I/dalvikvm(15482):   at java.lang.reflect.Method.invokeNative(Native Method)
    07-19 11:52:05.105: I/dalvikvm(15482):   at java.lang.reflect.Method.invoke(Method.java:511)
    07-19 11:52:05.105: I/dalvikvm(15482):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
    07-19 11:52:05.110: I/dalvikvm(15482):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
    07-19 11:52:05.110: I/dalvikvm(15482):   at dalvik.system.NativeStart.main(Native Method)
    07-19 11:52:05.110: D/skia(15482): --- decoder->decode returned false
    07-19 11:52:05.110: D/AndroidRuntime(15482): Shutting down VM
    07-19 11:52:05.110: W/dalvikvm(15482): threadid=1: thread exiting with uncaught exception (group=0x40c641f8)
    07-19 11:52:05.110: E/AndroidRuntime(15482): FATAL EXCEPTION: main
    07-19 11:52:05.110: E/AndroidRuntime(15482): java.lang.OutOfMemoryError
    07-19 11:52:05.110: E/AndroidRuntime(15482): 	at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
    et enfin j'ai le message d'erreur posté plus haut

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Mais encore avant ça....

    Les infos d'allocation c'est du "D" (debug) je crois.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Es ce ceci que vous me demandez ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    07-19 14:06:00.520: D/dalvikvm(20408): GC_FOR_ALLOC freed 369K, 4% free 59275K/61383K, paused 29ms
    07-19 14:06:00.520: I/dalvikvm-heap(20408): Forcing collection of SoftReferences for 31961104-byte allocation
    07-19 14:06:00.565: D/dalvikvm(20408): GC_BEFORE_OOM freed <1K, 4% free 59275K/61383K, paused 32ms
    07-19 14:06:00.565: E/dalvikvm-heap(20408): Out of memory on a 31961104-byte allocation.

  8. #8
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Surtout la derniere ligne
    07-19 14:06:00.565: E/dalvikvm-heap(20408): Out of memory on a 31961104-byte allocation.

    Allocation de 32Mo donc... Cela semble bien gros pour une image.... 8 millions de "vrais" pixels (RGB donc)....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    qualité maximum de l'image prise par le samsung galaxy s2. Les images sont très lourdes. Quand je prend des images de qualité minimum pas de problème.

  10. #10
    Membre habitué Avatar de linked
    Profil pro
    Développeur Android
    Inscrit en
    Mai 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Android

    Informations forums :
    Inscription : Mai 2008
    Messages : 88
    Points : 133
    Points
    133
    Par défaut
    Il faut baisser la qualité de l'image affiché, pas forcement la qualité de l'image prise par l'appareil photo. Et aussi bien gérer la mémoire entre deux images.
    Applications et jeux gratuits sur http://www.kamaxandroid.com

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    le problème c'est que l'image est envoyée aussi au serveur. Avec la qualité maximum la premier image est affichée mais dès qu'il s'agit de l'envoyer l'application plante

  12. #12
    Membre habitué Avatar de linked
    Profil pro
    Développeur Android
    Inscrit en
    Mai 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Android

    Informations forums :
    Inscription : Mai 2008
    Messages : 88
    Points : 133
    Points
    133
    Par défaut
    Ca me semble un peu confus tout ça. Je vois pas bien comment le fait d'envoyer un fichier sur le seurveur peut donner un Out Of Memory.

    Il doit y avoir un problème de gestion dans la mémoire, on peut voir le bout de code utilisé ?
    Applications et jeux gratuits sur http://www.kamaxandroid.com

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    le morceau de code pour enregistrer l'image est cité dans mon premier poste. voici le bout de code pour enregistrer cette image sur le serveur. Il fonctionne parfaitement quand les images sont prises en basse résolutions en haute soit l'application plante au moment de la prise de la 2eme image, soit au moment de l'enregistrement de l'image.

    Pour l'instant à defaut de trouver une solution à ce problème, j'ai mis un message d'avertissement enjoignant l'utilisateur de ne pas prendre des photos de hautes qualités.

    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
     
    	private void transferImage(String from,String imageName, int progr) throws IOException {
     
    		try {
    			// transforming image into byte array
    			ByteArrayOutputStream bos = new ByteArrayOutputStream();
    							bitmap1.compress(Bitmap.CompressFormat.JPEG, 25, bos);
     
    			byte[] bitmapdata = bos.toByteArray();
     
    			// base64 encoding of the bytes in a string
    			String bos1 = Base64.encodeBytes(bitmapdata);
     
    			// prepare request for server
    			postParameters = new ArrayList<NameValuePair>();
    			postParameters.add(new BasicNameValuePair("type", "photo"));
    			postParameters.add(new BasicNameValuePair("image", bos1));
    			postParameters.add(new BasicNameValuePair("name", imageName));
     
    			response = CustomHttpClient.executeHttpPost(Server.getPHPdirectory() + "nomFichier.php", postParameters);
    			/*
    gestions des retour du serveurs
    */
    			bitmapdata = null;
    			//imgTaken = null;
    			bos = null;
    			System.gc();
     
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}

  14. #14
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Oui... ok... donc tu as un affichage et en même temps tu *recharge* l'image en mémoire pour l'envoyer au serveur si j'ai bien compris....

    A mon sens il vaudrait mieux faire un truc genre:

    CAPTURE => sauvegarde dans un fichier local temporaire (RAM utilisée selon l'outil de capture)
    AFFICHAGE => a partir du fichier local (RAM utilisée selon l'afficheur)
    ENVOI-SERVEUR => le fichier temporaire (pas de RAM utilisée)

    Dans ce cas, le maximum utilisé dans l'application est pour l'affichage (et encore, avec un resize adapté à l'écran, sur un S2 cela ne fera plus que 1.5Mo
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/05/2009, 20h22
  2. [VB6] - Erreur mémoire avec une application multi feuille
    Par Aurazed dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 20/07/2007, 10h37
  3. comment augmenter les performances d'une application
    Par jasminblanc dans le forum Firebird
    Réponses: 1
    Dernier message: 17/07/2007, 19h39
  4. Réponses: 11
    Dernier message: 13/01/2006, 15h30
  5. Utilisation Mémoire d'une application
    Par scorplex dans le forum Composants VCL
    Réponses: 8
    Dernier message: 21/05/2005, 03h01

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