2011-03-15 26 views
8

Tengo un Motorola Defy OS Android 2.1 y hago una aplicación con cámara de vista previa. El problema es que la cámara funciona bien en Samsung Galaxy S con Android 2.1, pero en Motorola la cámara gira 90 grados. He intentado hacer esto:cámara Android girar

Parameters parameters = camera.getParameters(); 
parameters.setRotation(90); 

pero no está funcionando. No encontré ninguna solución todavía.

+0

respuesta presentes aquí -http: //stackoverflow.com/questions/14066038/why-image-captured-using-camera-intent-gets-rotated-on-some-devices-in-android –

+0

Esta [respuesta] (http://stackoverflow.com/a/40678737/2835520) puede ayudar – IgniteCoders

Respuesta

15
if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) { 
     camera.setDisplayOrientation(90); 
     lp.height = previewSurfaceHeight; 
     lp.width = (int) (previewSurfaceHeight/aspect); 
    } else { 
     camera.setDisplayOrientation(0); 
     lp.width = previewSurfaceWidth; 
     lp.height = (int) (previewSurfaceWidth/aspect); 
    } 
+0

Gracias por su respuesta, pero setDisplayOrientation solo funciona para Android 2.2 o 2.3 y mi aplicación es en 2.1. ¿Hay alguna otra forma de trabajar en 2.1 también? Si alguien resolvió este problema, por favor, ayúdame. – Laura

+1

emm. Lo probé en 2.1 allí funciona perfectamente. Creo que te refieres a mediarRecord.setDisplayOrientation: esto es compatible con 2.2 o superior – Peter

+0

Camera.setDisplayOrientation solo es compatible con API 8 (2.2) Ver http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation (int) – Ixx

0

Creo que no se puede hacer ninguna configuración para admitir la API 2.2 a 2.1. La API no tiene en tu dispositivo actual lib. Debe cambiar a 2,2 a apoyar el nivel API 8. Por cierto, también trato de utilizar la API de nivel 7:

Parameters parameters = camera.getParameters(); 
parameters.setRotation(90); 

Esta función funciona bien en el Samsung Galaxy Tab, pero Nexus uno. El Samsung Galaxy Tab utiliza el sistema operativo 2.2.0 y el Nexus uno usa el sistema operativo 2.2.1. Cuando trato de usar API nivel 8:

camera.setDisplayOrientation(90); 

ambos funcionan bien. Así que creo que el API nivel 7 tiene un problema cuando lo usamos en Android OS 2.2.1.

2

camera.setDisplayOrientation (int) no existe en 2.1!

y este código puede funcionar, pero fallan en mi hito/androide :(

Camera.Parameters parameters = camera.getParameters(); 
parameters.set("orientation", "portrait"); 
camera.setParameters(parameters); 

se puede ver más en http://code.google.com/p/android/issues/detail?id=1193#c42

+0

Probé con Motorola Defy android 2.1 y no funciona. – Derzu

+0

esto funciona fantástico para mí en mi naranja san francisco. gracias :) – jampez77

2

He encontrado el código que funciona en Android 1.6 y más (trabaja para me usando 2,1 y presente de vista previa en el modo de retrato sin girar)

public void surfaceCreated(SurfaceHolder holder){ 
     try{ 
      camera = Camera.open(); 
      setDisplayOrientation(camera, 90); 
      camera.setPreviewDisplay(holder); 
      camera.startPreview(); 
     }catch(IOException e){ 
      Log.d("CAMERA", e.getMessage()); 
     } 

} 

protected void setDisplayOrientation(Camera camera, int angle){ 
     Method downPolymorphic; 
     try 
     { 
      downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class }); 
      if (downPolymorphic != null) 
       downPolymorphic.invoke(camera, new Object[] { angle }); 
     } 
     catch (Exception e1) 
     { 
     } 
} 

La actividad tiene androide: screenOrientation = "retrato" en AndroidManifest.xml

http://code.google.com/p/android/issues/detail?id=1193#c42

+0

Probé con Motorola Defy android 2.1 y no funciona. – Derzu

6

Hay código oficial ejemplo de esto en la documentación de Android ahora (bajo setDisplayOrientation()):

public static void setCameraDisplayOrientation(Activity activity, 
     int cameraId, android.hardware.Camera camera) 
{ 
    android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); 
    android.hardware.Camera.getCameraInfo(cameraId, info); 
    int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); 
    int degrees = 0; 
    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 (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) 
    { 
     result = (info.orientation + degrees) % 360; 
     result = (360 - result) % 360; // compensate the mirror 
    } 
    else 
    { // back-facing 
     result = (info.orientation - degrees + 360) % 360; 
    } 
    camera.setDisplayOrientation(result); 
} 
+0

¿Qué es int cameraId? –

+1

@Fahad ID de la cámara se refiere a la cámara trasera o frontal. 0 para mirar hacia atrás, 1 para mirar hacia el frente. Probablemente sea mejor utilizar las variables de instancia estáticas 'Camera.CameraInfo.CAMERA_FACING_BACK' y' Camera.CameraInfo.CAMERA_FACING_FRONT'. –

+0

@Timmmm JFYI, 'camera.setDisplayOrientation' no hace nada en el Samsung Galaxy SII. –

1
public static void setCameraDisplayOrientation(Activity activity, 
               int cameraId,android.hardware.Camera camera) { 
    android.hardware.Camera.CameraInfo info = 
      new android.hardware.Camera.CameraInfo(); 
    android.hardware.Camera.getCameraInfo(cameraId, info); 
    int rotation = activity.getWindowManager().getDefaultDisplay() 
      .getRotation(); 
    int degrees = 0; 
    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 (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
     result = (info.orientation + degrees) % 360; 
     result = (360 - result) % 360; // compensate the mirror 
    } else { // back-facing 
     result = (info.orientation - degrees + 360) % 360; 
    } 
    camera.setDisplayOrientation(result); 
} 
+0

Esto realmente funciona muy bien, si la vista de la cámara se extiende alguna vista, entonces también tenemos que invertir el ancho/cálculos de altura en el método onLayout. – radhoo