Implementando OrientationEventListener para ayudar a problemas de cámara sin CameraInfo?

Necesito implementar un OrientationEventListener para que la cámara funcione correctamente. Google publicó una implementación de ejemplo de onOrientationChanged que se ve así:

 @Override public void onOrientationChanged(int orientation) { if (orientation == ORIENTATION_UNKNOWN) return; android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(cameraId, info); orientation = (orientation + 45) / 90 * 90; int rotation = 0; if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { rotation = (info.orientation - orientation + 360) % 360; } else { // back-facing camera rotation = (info.orientation + orientation) % 360; } mParameters.setRotation(rotation); } 

Pero estoy construyendo contra API nivel 8, así que no tengo CameraInfo . ¿Cómo puedo lograr una cosa similar a la anterior sin CameraInfo ?

Aunque los cambios de orientación, creo que también tengo que cambiar la vista previa de la cámara para que coincida, si desea que las imágenes de pantalla completa en la rotación, por lo que utilizar un método similar, pero en el método onLayout ()

 /* * This class provides the surface for the camera. */ public class CameraSurfaceView extends ViewGroup implements SurfaceHolder.Callback { @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { if (changed) { final int width = right - left; final int height = bottom - top; int previewWidth = width; int previewHeight = height; if (mPreviewSize != null) { Display display = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); switch (display.getRotation()) { case Surface.ROTATION_0: previewWidth = mPreviewSize.height; previewHeight = mPreviewSize.width; mCamera.setDisplayOrientation(90); break; case Surface.ROTATION_90: previewWidth = mPreviewSize.width; previewHeight = mPreviewSize.height; break; case Surface.ROTATION_180: previewWidth = mPreviewSize.height; previewHeight = mPreviewSize.width; break; case Surface.ROTATION_270: previewWidth = mPreviewSize.width; previewHeight = mPreviewSize.height; mCamera.setDisplayOrientation(180); break; } } final int scaledChildHeight = previewHeight * width / previewWidth; cameraView.layout(0, height - scaledChildHeight, width, height); } } 

}

Esto ha funcionado para mí en un HTC Desire utilizando Android API 8 (Android 2.2).

 public void onOrientationChanged(int orientation) { if (orientation == ORIENTATION_UNKNOWN) return; 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; } parameters.setRotation(degrees ); mcamera.setParameters(parameters); } 

Espero que esto ayude.

EDIT: Consulte el código fuente de la aplicación Cámara para saber cómo lo manejó. Este enlace es para la fuente más reciente. Puede volver atrás en las revisiones y ver para la versión 2.2.
Fuente de la cámara

EDIT: Aquí está el enlace a una de esas revisiones cerca de la versión 2.2. Search onOrientationChanged en este archivo: Camera src

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.