Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Utiliser l'appareil photo

    5 mai 2012 à 0:52:20

    Bonsoir,

    je souhaiterais utiliser l'appareil photo du téléphone dans mon application. J'ai donc commencé a faire un nouveau projet dans lequel je ne fais qu'utiliser l'appareil photo dés le démarrage de l'application. J'ai trouvé plusieurs tuto a ce sujet mais a chaque fois c'est le même résultat :

    -Je lance l'application sur mon AVD : l'application se lance correctement, mais celle ci n'affiche que des carrés noir & blanc, ce qui doit probablement être dû au fait que l'AVD ne gère pas l'appareil photo, malgrés le fait qu'au démarrage de l'AVD, celle ci me demande la source de capture, et me propose d'utiliser ma webcam.
    -Je lance l'application sur un téléphone réel : l'application plante au démarrage.

    Quelqu'un aurait il une solution a me proposer? Ou du moins, me donner des indications pour savoir d'ou vient l'erreur, étant donné que mon appli ne plante pas sur mon AVD, il m'est impossible de savoir d'ou vient le problème ...

    Cordialement, Gnaag.
    • Partager sur Facebook
    • Partager sur Twitter
      5 mai 2012 à 2:06:41

      Bonsoir,

      Le LogCat est ton ami pour trouver la cause de ton crash.
      • Partager sur Facebook
      • Partager sur Twitter
        5 mai 2012 à 12:08:16

        Merci de ta réponse Fumble, mais justement le problème c'est que mon application ne crash pas lorsqu'elle est lancée sur l'AVD.
        • Partager sur Facebook
        • Partager sur Twitter
          5 mai 2012 à 12:12:38

          Branche le téléphone qui crashe dans Eclipse et refait ton test.

          En effet, nous ne sommes pas devin et sans LogCat ou bout de code, nous ne pouvons pas deviner ce qui ne va pas et donc t'aider.
          • Partager sur Facebook
          • Partager sur Twitter
            5 mai 2012 à 12:18:44

            Il est donc possible de voir les erreurs dans le LogCat d'Eclipse lorsqu'une application crash sur un téléphone physique?
            Faut il faire une quelconque manipulation? Autre que brancher le téléphone bien sur.

            EDIT : J'ai bien activé le débogage USB sur le téléphone, toutefois le téléphone n'apparait dans le DDMS d'Eclipse.
            • Partager sur Facebook
            • Partager sur Twitter
              5 mai 2012 à 12:31:34

              Il faut le mettre en mode debug et accepter les sources inconnues.
              Respectivement, Paramètres > Applications > Développement > Débogage USB et Paramètres > Applications > Sources inconnues
              • Partager sur Facebook
              • Partager sur Twitter
                5 mai 2012 à 12:35:24

                Je viens de le faire, mais le téléphone n'apparait pas dans le DDMS d'Eclipse.
                Même en faisant un "adb devices" dans l'invite de commande, il ne m'affiche que les émulateurs.
                • Partager sur Facebook
                • Partager sur Twitter
                  5 mai 2012 à 12:57:13

                  Sous Windows, il faut installer les drivers du téléphone. Via Kies si tu as un Samsung, le logiciel fourni par HTC et sinon tu peux essayer le pack de driver fourni par Google (disponible via le module de téléchargement des différents SDK Android dans Eclipse).

                  Si tu es sous Linux, il y a une petite manipulation à faire. Regarde ici.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 mai 2012 à 13:53:52

                    Je suis sous Windows, et le téléphone sur lequel je souhaite effectuer le débogage est le HTC Desire HD. J'ai essayé d'installer le driver fourni par Google via le gestionnaire de périphérique en sélectionnant le dossier :

                    C:\Program Files\Android\android-sdk\extras\google\usb_driver

                    Mais sans résultat. Quel est le logiciel fourni par HTC permettant le débogage?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 mai 2012 à 15:06:58

                      Pour HTC, les drivers sont fournis par le logiciel HTC Sync.

                      Une fois que les drivers sont installés et ton téléphone reconnu par Windows (oublie Eclipse pour le moment), tu redémarres ton PC.

                      Ensuite tu lance Eclipse, tu passes ton téléphone en mode debug puis tu le connectes en USB.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 mai 2012 à 15:50:57

                        Merci beaucoup, je vais essayer et je te tiens au courant ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          7 mai 2012 à 16:01:32

                          Bon j'ai réussi a trouver d’où viens l'erreur et a utiliser l'HTC avec eclipse.

                          Maintenant voici a quoi ressemble ma surfaceChanged :

                          public void surfaceChanged(SurfaceHolder holder, int format, int width,
                          			int height) {
                          		// TODO Auto-generated method stub
                          		// Si le mode preview est lancé alors on le stop
                          		if (isPreview) {
                          			camera.stopPreview();
                          			
                          		}
                          		// On récupère les parametres de la camera
                          		Camera.Parameters parameters = camera.getParameters();
                          		List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
                          		Camera.Size previewSize = previewSizes.get(0);
                          		
                          		// On change la taille
                          		parameters.setPreviewSize(previewSize.width, previewSize.height);
                          
                          		// On applique nos nouveaux parametres
                          		camera.setParameters(parameters);
                          
                          		try {
                          			// On attache notre previsualisation de la camera au holder de la
                          			// surface
                          			camera.setPreviewDisplay(surfaceCamera.getHolder());
                          		} catch (IOException e) {
                          		}
                          
                          		// On lance la previeuw
                          		camera.startPreview();
                          
                          		isPreview = true;
                          	}
                          


                          Toutefois, malgré le fait que ce code fonctionne, j'aimerais savoir si je devais modifier cette ligne afin d'adapter mon code a différent téléphone :

                          Camera.Size previewSize = previewSizes.get(0);
                          
                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 mai 2012 à 22:27:20

                            Tu peux laisser la taille par défaut en ne changeant pas le paramètre.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              8 mai 2012 à 12:19:20

                              Si j'ai bien compris, je laisse le code suivant :

                              public void surfaceChanged(SurfaceHolder holder, int format, int width,
                              			int height) {
                              		// TODO Auto-generated method stub
                              		// Si le mode preview est lancé alors on le stop
                              		if (isPreview) {
                              			camera.stopPreview();
                              			
                              		}
                                              try {
                              			// On attache notre previsualisation de la camera au holder de la
                              			// surface
                              			camera.setPreviewDisplay(surfaceCamera.getHolder());
                              		} catch (IOException e) {
                              		}
                              
                              		// On lance la previeuw
                              		camera.startPreview();
                              
                              		isPreview = true;
                              	}
                              


                              Par contre, mon image se retrouve écrasé que ce soit en mode portrait ou paysage.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                8 mai 2012 à 19:20:31

                                A l'époque, quand je faisait des tutos sur Android, j'ai lu cet article concernant l'appareil photo. Cela fait donc plus d'un an que je n'ai pas retouché à appareil photo d'Android. Donc, c'est un peu dur de t'aider de mémoire. :)

                                J'ai peut-être zappé une ligne ou deux en essayant de te répondre mais jettes-y un œil car je n'avais pas eu de problème d'écrasement de l'image.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  8 mai 2012 à 20:10:56

                                  C'est exactement le tuto que j'ai suivi ^^
                                  Le problème, c'est qu'en suivant pas à pas le tuto, j'ai une erreur SetParameters failed
                                  J'ai donc effectué d'autres recherches, et j'ai trouvé ces deux lignes qui me permettent de résoudre le problème d'erreur :

                                  List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
                                  Camera.Size previewSize = previewSizes.get(0);
                                  


                                  Et voila que maintenant, lorsque je suis en mode paysage, je n'ai aucun problème, mais lorsque je suis en mode portrait, l’image est a la fois écrasée et l'image et tout de même affiché en format paysage.


                                  EDIT : Je pense avoir résolu le problème, en rajoutant le code suivant

                                  //On récupére le display afin de connaitre l'orientation du téléphone.
                                  	Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
                                  		
                                  	// On change la taille selon l'orientation du téléphone
                                  	if(display.getRotation() == Surface.ROTATION_0)
                                          {
                                              parameters.setPreviewSize(height, width);                           
                                              camera.setDisplayOrientation(90);
                                              
                                          }
                                          if(display.getRotation() == Surface.ROTATION_90)
                                          {
                                              parameters.setPreviewSize(width, height);                           
                                          }
                                  
                                          if(display.getRotation() == Surface.ROTATION_180)
                                          {
                                              parameters.setPreviewSize(height, width);               
                                          }
                                  
                                          if(display.getRotation() == Surface.ROTATION_270)
                                          {
                                              parameters.setPreviewSize(width, height);
                                              camera.setDisplayOrientation(180);
                                          }
                                  


                                  Ainsi en mode paysage, cela ne change rien, mais en mode portrait, l'affichage se fait correctement, en mode portrait, et apparemment cela résout aussi le problème d'image écrasé


                                  EDIT 2 : Je continue le tuto afin de pouvoir prendre des photos avec mon application. J'ai donc ajouté ceci dans le OnCreate :

                                  // Quand on clique sur notre surface
                                  surfaceCamera.setOnClickListener(new OnClickListener() {
                                  
                                  	public void onClick(View v) {
                                  		// On prend une photo
                                  		if (camera != null) {
                                  			SavePicture();
                                  		}
                                  
                                  	}
                                  });
                                  


                                  Puis j'ai créé la fonction SavePicture() :

                                  private void SavePicture() {
                                  		try {
                                  			
                                  			SimpleDateFormat timeStampFormat = new SimpleDateFormat(
                                  					"yyyy-MM-dd-HH.mm.ss");
                                  			String fileName = "photo_" + timeStampFormat.format(new Date())
                                  					+ ".jpg";
                                  
                                  			// Metadata pour la photo
                                  			ContentValues values = new ContentValues();
                                  			values.put(Media.TITLE, fileName);
                                  			values.put(Media.DISPLAY_NAME, fileName);
                                  			values.put(Media.DESCRIPTION, "Image prise par FormationCamera");
                                  			values.put(Media.DATE_TAKEN, new Date().getTime());
                                  			values.put(Media.MIME_TYPE, "image/jpeg");
                                  
                                  			// Support de stockage
                                  			Uri taken = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI,
                                  					values);
                                  
                                  			// Ouverture du flux pour la sauvegarde
                                  			final FileOutputStream stream = (FileOutputStream) getContentResolver().openOutputStream(taken);
                                  			// Callback pour la prise de photo
                                  			
                                  			Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
                                  
                                  				public void onPictureTaken(byte[] data, Camera camera) {
                                  					if (data != null) {
                                  						// Enregistrement de votre image
                                  						try {
                                  							if (stream != null) {
                                  								stream.write(data);
                                  								stream.flush();
                                  								stream.close();
                                  							}
                                  						} catch (Exception e) {
                                  							// TODO: handle exception
                                  						}
                                  
                                  						// On redémarre la prévisualisation
                                  						camera.startPreview();
                                  					}
                                  				}
                                  			};
                                  			
                                  			camera.takePicture(null, pictureCallback, pictureCallback);
                                  		} catch (Exception e) {
                                  			// TODO: handle exception
                                  		}
                                  		
                                  
                                  	}
                                  


                                  Toutefois, l'application se fige une fois que je souhaite prendre une photo, et aprés un certain temps d'attente, j'ai le choix entre attendre ou forcer l’arrêt de l'application. Par contre ce qui m’ennuie un peu plus, c'est que lorsque je force l'arrêt de l'application, je ne peut plus utiliser la caméra, et je suis dans l'obligation de redémarrer le téléphone à chaque fois...
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  [Android] Utiliser l'appareil photo

                                  × 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