Aller au contenu

Problème pour modifier les paramètres de la camera


TsCyrille

Recommended Posts

Bonjour

J'ai un problème quand je veux modifier les paramètres de la camera. Voici mon code :

public class Photo extends Activity implements Callback  {

   private Camera camera = null;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       SurfaceView view = new SurfaceView(this);
       view.getHolder().addCallback(this);
         view.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

       setContentView(view);

   }

   @Override
   public void surfaceChanged(SurfaceHolder holder, int format, int width,
           int height) {
       try {
       Camera.Parameters parameters = camera.getParameters();
       parameters.setPreviewSize(width, height);
       parameters.setPictureFormat(PixelFormat.JPEG);
       camera.setParameters(parameters);
               camera.startPreview();
       } catch (Exception e) {
           Toast
           .makeText(Photo.this, e.getMessage(), Toast.LENGTH_LONG)
           .show();

       }


   }

   @Override
   public void surfaceCreated(SurfaceHolder holder) {
       try {
           camera = Camera.open();
           camera.setPreviewDisplay(holder);
       } catch (Exception e) {

       }
   }

   @Override
   public void surfaceDestroyed(SurfaceHolder holder) {
       camera.stopPreview();
       camera.release();
       camera = null;

   }

Quand j'exécute l'évènement surfaceChanged, j'ai l'exception suivante : "setParameters failed"

Est-ce que quelqu'un aurait une idée ?

Pour information :

- J'utilise la permission CAMERA

- Cela ne marche pas sur mon portable (HTC Desire) alors que cela fonctionne quand je fais mes tests sur un émulateur

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

En fait ce bout de code ne marche pas sur mon HTC Desire mais marche sur un Samsung Galaxy S...

En cherchant de plus près, j'ai trouvé que c'est la mise à jour de ce paramètre qui fait "planter" le HTC Desire :

parameters.setPreviewSize(width, height);

Je ne comprends pas trop pourquoi (pour l'instant, je n'utilise pas cette ligne et cela fonctionne). Si quelqu'un à une explication, je suis preneur...

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

Pour ce que ça intéresse j'ai trouvé comment remplacer le code suivant :

parameters.setPreviewSize(width, height);

par le code suivant :

...
List sizes = parameters.getSupportedPreviewSizes();
Size optimalSize = getOptimalPreviewSize(sizes, w, h);
...

       private Size getOptimalPreviewSize(List sizes, int w, int h) {
           final double ASPECT_TOLERANCE = 0.05;
           double targetRatio = (double) w / h;
           if (sizes == null) return null;

           Size optimalSize = null;
           double minDiff = Double.MAX_VALUE;

           int targetHeight = h;

           // Try to find an size match aspect ratio and size
           for (Size size : sizes) {
               double ratio = (double) size.width / size.height;
               if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
               if (Math.abs(size.height - targetHeight) < minDiff) {
                   optimalSize = size;
                   minDiff = Math.abs(size.height - targetHeight);
               }
           }

           // Cannot find the one match the aspect ratio, ignore the requirement
           if (optimalSize == null) {
               minDiff = Double.MAX_VALUE;
               for (Size size : sizes) {
                   if (Math.abs(size.height - targetHeight) < minDiff) {
                       optimalSize = size;
                       minDiff = Math.abs(size.height - targetHeight);
                   }
               }
           }
           return optimalSize;
       }

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...