La cámara de Android gira

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

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

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

 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); } 

Hay un código de ejemplo oficial para esto en los documentos 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); } 

camera.setDisplayOrientation (int) no existe en 2.1!

Y este código puede funcionar, pero falla en mi hito / droid 🙁

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

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

Encontré este código que funciona en Android 1.6 y versiones posteriores (funciona para mí usando la vista previa 2.1 y presente en modo vertical 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 Android: screenOrientation = “portrait” en AndroidManifest.xml

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

 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); } 

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 para admitir el nivel 8 de la API. Por cierto, también trato de usar el nivel 7 de la API:

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