TsCyrille Posté(e) 23 septembre 2010 Share Posté(e) 23 septembre 2010 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 More sharing options...
TsCyrille Posté(e) 23 septembre 2010 Auteur Share Posté(e) 23 septembre 2010 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 More sharing options...
TsCyrille Posté(e) 24 septembre 2010 Auteur Share Posté(e) 24 septembre 2010 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 More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.