Android – L’aperçu de la caméra est sur le côté

J’utilise un aperçu pour afficher ce que la caméra voit à l’écran.

Je peux tout faire fonctionner correctement, la surface créée, la surface définie et la surface affichée.

Cependant, l’image affiche toujours un angle de 90 degrés incorrect en mode portrait.

Comme dans l’image:

texte alt

Je suis conscient que l’utilisation du code suivant définira l’image comme suit:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

Cependant, j’ai une prévisualisation dans une activité qui contient d’autres éléments et cela n’a aucun sens que mon activité soit affichée en mode paysage. (Son désactivé par défaut)

Donc, je me demandais s’il y avait tout simplement changer l’orientation de l’aperçu? Et laisser le rest de mon activité correctement affiché en mode portrait?

Ou de toute façon faire pivoter l’aperçu pour qu’il s’affiche correctement?

Ce problème est apparu comme un bogue avec certains matériels , mais vous pouvez le résoudre en utilisant l’appel à mCamera.setDisplayOrientation (degrés) disponible dans l’API 8. Voici comment je l’implémente:

 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (isPreviewRunning) { mCamera.stopPreview(); } Parameters parameters = mCamera.getParameters(); Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); if(display.getRotation() == Surface.ROTATION_0) { parameters.setPreviewSize(height, width); mCamera.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); mCamera.setDisplayOrientation(180); } mCamera.setParameters(parameters); previewCamera(); } And the previewCamera method : public void previewCamera() { try { mCamera.setPreviewDisplay(mSurfaceHolder); mCamera.startPreview(); isPreviewRunning = true; } catch(Exception e) { Log.d(APP_CLASS, "Cannot start preview", e); } } 

C’était sur un HTC Desire et je devais d’abord mettre des instructions de journalisation dans chacune des vérifications de rotation pour dire quelle était la rotation, puis déboguer sur l’appareil et regarder la sortie de logCat pendant que je faisais pivoter l’appareil. Pour le HTC Desire, 0 était le téléphone comme vous vous y attendiez (portrait), 90 degrés faisait tourner le téléphone de 90 degrés dans le sens contraire des aiguilles d’une montre (j’avais supposé que cela aurait été dans le sens des aiguilles d’une montre). Dans le code, vous verrez que je n’avais pas besoin de faire de rotation lorsque le téléphone était à 90 ou 180 degrés – l’appareil semblait gérer cela lui-même. Un seul point ne fonctionne pas correctement: La rotation à 270 degrés est lorsque vous tournez l’appareil de 90 degrés dans le sens des aiguilles d’une montre et que la rotation de l’affichage est correcte mais si vous faites pivoter l’appareil de 270 degrés dans le sens inverse.

PS Notez le changement de largeur et de hauteur dans les rotations appropriées.

essayez de définir l’orientation de l’affichage. Cela résout mon problème.

  mCamera.setDisplayOrientation(90); 
  public void surfaceCreated(SurfaceHolder holder) { mCamera = Camera.open(); mCamera.setDisplayOrientation(90); try { mCamera.setPreviewDisplay(holder); mCamera.setPreviewCallback(new PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { } }); } catch (Exception e) { e.printStackTrace(); } } 

essayer ce code

Je l’ai fait en prenant conseil de mCamera.setDisplayOrientation (90); mais a également fait pivoter le bitmap car pour une raison quelconque, les autres approches ne fonctionnent pas pour moi dans la version 2.3.3.

Pour faire pivoter le bitmap je l’ai fait:

 Masortingx masortingx = new Masortingx(); masortingx.postRotate(90); imageView1 = new ImageView(this); Bitmap bitmap = BitmapFactory.decodeFile(files[i].getAbsolutePath()); Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), masortingx, true); Bitmap scaledBitmap = Bitmap.createScaledBitmap(rotatedBitmap, 80, 80, true); imageView1.setImageBitmap(scaledBitmap); 

J’ai un problème avec la caméra frontale (problème à l’envers). Alors j’utilise cette méthode

 public void setCameraDisplayOrientation(Activity activity , int icameraId , Camera camera1s) { CameraInfo cameraInfo = new CameraInfo(); Camera.getCameraInfo(icameraId, cameraInfo); int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); int degrees = 0; // k switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { // cameraType=CAMERATYPE.FRONT; result = (cameraInfo.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing result = (cameraInfo.orientation - degrees + 360) % 360; } // displayRotate=result; camera.setDisplayOrientation(result); } 

J’ai comparé mon code à celui du didacticiel et j’ai finalement corrigé le problème en mettant le code suivant dans mon AndroidManifext.xml: Dans la :

 android:screenOrientation="landscape" android:configChanges="keyboardHidden|orientation"> 
 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // If your preview can change or rotate, take care of those events here. // Make sure to stop the preview before resizing or reformatting it. if (mHolder.getSurface() == null) { // preview surface does not exist return; } try { mCamera.stopPreview(); } catch (Exception e) { e.printStackTrace(); } Camera.Parameters parameters = mCamera.getParameters(); Display display = ((WindowManager) getContext().getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); if (display.getRotation() == Surface.ROTATION_0) { parameters.setPreviewSize(h, w); mCamera.setDisplayOrientation(90); } if (display.getRotation() == Surface.ROTATION_90) { parameters.setPreviewSize(w, h); mCamera.setDisplayOrientation(0); } if (display.getRotation() == Surface.ROTATION_180) { parameters.setPreviewSize(h, w); mCamera.setDisplayOrientation(270); } if (display.getRotation() == Surface.ROTATION_270) { parameters.setPreviewSize(w, h); mCamera.setDisplayOrientation(180); } previewCamera(); } public void previewCamera() { try { mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); } catch (Exception e) { //Log.d(APP_CLASS, "Cannot start preview", e); e.printStackTrace(); } } 

Cette ligne a parfaitement fonctionné pour moi

  static { ORIENTATIONS.append(Surface.ROTATION_0, 90); ORIENTATIONS.append(Surface.ROTATION_90, 180); ORIENTATIONS.append(Surface.ROTATION_180, 270); ORIENTATIONS.append(Surface.ROTATION_270, 360); }