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.
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 !
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