Prévisualiser l'image avant de prendre une photo

 

Il est obligatoire de prévisualiser ce qui passe par la caméra avant de pouvoir prendre une photo avec une caméra.

Pour effectuer cette prévisualisation, vous pourrez utiliser une SurfaceView.

Il suffit ensuite d'indiquer à la caméra l'instance de SurfaceHolder associée à la SurfaceView pour permettre à la caméra de modifier/synchroniser le contenu de la SurfaceView avec le buffer de la caméra.

 

Préparer l'activité

Avant tout, il faut préparer l'activité à gérer la surfaceView.

Cela se fait en deux étapes:

Implémenter les procédures callback de la surfaceholder:

implements SurfaceHolder.Callback

Ce qui permettra d'avoir 3 méthodes supplémentaires de gestion de la surface:

  • public void surfaceCreated(SurfaceHolder holder)
    • Pour indiquer le gestionnaire de surfaces à utiliser par la caméra pour accéder à la surfaceView: camera.setPreviewDisplay(holder);
    • Pour éventuellement démarrer la preview de la caméra:camera.startPreview();
    • Tout ce dont vous aurez vous même besoin de faire...
  • public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
    • Rien de particulier pour la caméra pour le moment...
  • public void surfaceDestroyed(SurfaceHolder holder)
    • Si la surface vient à disparaître, il faut stopper la preview de la caméra avant et lui indiquer en passant que la surface n'est plus accessible ! La méthode se nomme tout simplement camera.stopPreview()

Paramétrer l'instance de SurfaceHolder avec la SurfaceView utilisée.

Image non trouvée !Il est plus que probable que l'activité passe dans la méthode onPause avant que sa surface ne soit détruite. Dans ce cas, il faut faire un stopPreview dans le onPause avant un release de la camera et tester la validité de la caméra dans surfaceDestroyed en testant par exemple la valeur null dans l'instance de camera positionnée lors du onPause !

 

Exemple de code

En reprenant le code déjà vu pour permettre la gestion d'une caméra dans le cycle de vie d'une activité, vous obtenez le code suivant:

Un layout activity_main.xml rudimentaire:

Et ne pas oublier les permissions dans le fichier manifest !

 

Définir l'orientation de la caméra à l'affichage

La caméra ne retourne pas forcement son rendu (preview) dans le même sens que celui où vous regardez l'écran. Et c'est encore pire avec la caméra frontale avec un effet miroir (il faudra déterminer la caméra utilisée: frontale, ou arrière).

Pour résoudre ce problème, il faudra indiquer à l'instance de la classe Camera l'orientation de l'affichage.

Voici une solution de méthode (proposé par Google) pour déterminer cette rotation:

Exemple de Google pour traiter le cas de la rotation de l'écran.

Avant l'API 14, cette méthode ne doit pas être appelée lorsque la caméra est en mode preview mais avant de passer en mode preview...Sinon, il est trop tard pour pouvoir prendre en compte cette information !

Image non trouvée !Cette rotation de l'image ne change en rien l'orientation définie lors de la prise de la photo. Elle ne sert donc bien qu'à l'affichage lors du preview. Elle n'affecte donc pas l'image JPEG que vous sauverez !

 

annexe

Rotation de l'écran