Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Appareil photo plante

après une prise de photo l'application plante

Sujet résolu
    10 mai 2012 à 9:43:28

    J'utilise le tutoriel suivant, sur developer.android.com http://developer.android.com/training/ [...] tobasics.html avec API 2.1

    • - Quand je clique sur "prendre petite photo", pas de problème
    • -Quand je clique sur "prendre une petite photo" et ensuite "prendre une grande photo" pas de problème
    • - Mais quand je clique directement sur "prendre une petite photo", l'application ouvre l'appareil photo, prend une photo et plante.


    Voici mon logCat :
    05-10 09:26:30.773: D/CameraSample(3407): failed to create directory
    05-10 09:26:33.713: W/IInputConnectionWrapper(3407): showStatusIcon on inactive InputConnection
    05-10 09:26:45.883: I/Parcours(3407): handleBigCameraPhoto
    05-10 09:26:46.133: D/dalvikvm(3407): GC_EXTERNAL_ALLOC freed 124K, 52% free 2628K/5379K, external 1685K/2133K, paused 207ms
    05-10 09:26:46.143: E/dalvikvm-heap(3407): 31961088-byte external allocation too large for this process.
    05-10 09:26:46.163: E/GraphicsJNI(3407): VM won't let us allocate 31961088 bytes
    05-10 09:26:46.213: D/dalvikvm(3407): GC_FOR_MALLOC freed 2K, 52% free 2625K/5379K, external 1685K/2133K, paused 55ms
    05-10 09:26:46.213: D/skia(3407): --- decoder->decode returned false
    05-10 09:26:46.213: D/AndroidRuntime(3407): Shutting down VM
    05-10 09:26:46.223: W/dalvikvm(3407): threadid=1: thread exiting with uncaught exception (group=0x4001d560)
    05-10 09:26:46.223: E/AndroidRuntime(3407): FATAL EXCEPTION: main
    05-10 09:26:46.223: E/AndroidRuntime(3407): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:470)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:284)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at rdaquin.apps.takephoto.TakePhotoActivity.setPic(TakePhotoActivity.java:124)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at rdaquin.apps.takephoto.TakePhotoActivity.handleBigCameraPhoto(TakePhotoActivity.java:195)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at rdaquin.apps.takephoto.TakePhotoActivity.onActivityResult(TakePhotoActivity.java:281)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at android.app.Activity.dispatchActivityResult(Activity.java:3908)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at android.app.ActivityThread.deliverResults(ActivityThread.java:2549)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at android.app.ActivityThread.handleSendResult(ActivityThread.java:2595)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at android.app.ActivityThread.access$2000(ActivityThread.java:121)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:973)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at android.os.Handler.dispatchMessage(Handler.java:99)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at android.os.Looper.loop(Looper.java:123)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at android.app.ActivityThread.main(ActivityThread.java:3701)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at java.lang.reflect.Method.invokeNative(Native Method)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at java.lang.reflect.Method.invoke(Method.java:507)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
    05-10 09:26:46.223: E/AndroidRuntime(3407):         at dalvik.system.NativeStart.main(Native Method)


    Si vous voulez le code, dite le moi.
    Je ne comprend pas pourquoi mon application plante, j'ai l'impression que c'est un problème de mémoire mais je ne sais pas quoi faire.
    Alors que quand je fais "prendre une petite image" et "prendre une grande image" ça fonctionne. Mais si je recharge l'application et que je fais "prendre une grande image" ça ne fonctionne pas ...

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      10 mai 2012 à 9:51:06

      Bonjour,

      Bienvenue dans les joies du développement mobile ! :)

      Il faut savoir une chose essentielle : la mémoire des mobiles est bien plus petite que sur des ordinateurs fixes. De ce fait, il faut souvent faire preuve d'ingéniosité pour éviter ce genre d'erreur !

      Pour peu que tu possèdes un smartphone avec un appareil photo qui prend des photos d'une assez grande résolution, il va falloir resizer et réduire sa qualité pour qu'il puisse être géré au niveau de la mémoire.

      Je ne peux que te conseiller cet excellent tutoriel assez récent posté par Google sur sa documentation : http://developer.android.com/training/ [...] ps/index.html
      • Partager sur Facebook
      • Partager sur Twitter
      Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
        10 mai 2012 à 10:09:43

        Okey, merci.
        Je vais regarder ça, et oui mon smartphone fait des photos 8MP. Mais c'est une application qui va être rendu grand public donc pas évident.
        Il est possible de modifier les paramètres de l'appareil photo de l'utilisateur avant ?
        • Partager sur Facebook
        • Partager sur Twitter
          10 mai 2012 à 10:17:31

          Citation : rdaquin

          Il est possible de modifier les paramètres de l'appareil photo de l'utilisateur avant ?


          Je ne comprends pas trop ce que tu demandes. Tu voudrais savoir si tu peux définir la résolution lors de la capture de la photo ?
          Si c'est bien ça, je ne pense pas et je ne vois pas vraiment le but :
          • Tu peux tout à fait resizer et réduire la qualité de la photo de manière temporaire dans ton application.
          • Et lors d'un quelconque export, la qualité de la photo sera conservé.
          C'est quand même bien plus intéressant que d'avoir un smartphone qui fait de superbes photos mais ne pas pouvoir en profiter pleinement.

          • Partager sur Facebook
          • Partager sur Twitter
          Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
            10 mai 2012 à 10:20:14

            Oui, c'est bien ça que je voulais savoir. En faite dans mon application je réduis la taille de la photo pour pouvoir l'envoyer sur un serveur ensuite.

            Là, j'ai commencé à lire la documentation Android sur ce problème de mémoire, je vais voir si je trouve une solution à mon problème sinon je serais bien embêté.

            Ah aussi, une petite question parce que je ne comprend pas. Je ne sais pas si tu as déjà vu ce tutoriel, mais en faite on peut soit faire une petite photo (sans être enregistré, juste affiché) et une grande qui est enregistré puis affiché. Alors quand je fais une grande, l'appli plante mais quand je recharge l'app et que je fais d'abord une petite photo et ensuite une grande, là je n'ai pas de problème. Il y a une raison ?

            -------------------------------------------------------------------------------------------------------
            J'ai trouvé de où venez le problème, alors je dois modifier le
            bmpOptions.inSampleSize
            

            dans mon example je l'ai mis à 5, ce qui découpe 1/5 les cotés. Par contre j'aurais voulu le faire dynamiquement mais je ne vois pas trop comment le calculer, tu aurais une idée ?
            • Partager sur Facebook
            • Partager sur Twitter
              10 mai 2012 à 14:04:21

              Dans le tutoriel que je t'ai indiqué plus haut, il t'explique comment resizer et réduire la taille de tes images en fonction de la taille de ton écran. En bonus, il t'explique même comment mettre en place un système de mise en cache.

              Du coup, je pense que ça devrait répondre pleinement à ta demande.
              • Partager sur Facebook
              • Partager sur Twitter
              Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.

              [Android] Appareil photo plante

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown