studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android camera orientation

para - manual de programacion android pdf



Problema de orientación de la imagen de Android con actividad de cámara personalizada (4)

ASÍ QUE enfrentas algún problema con la orientación de la cámara.

Este enlace muestra una aplicación de ejemplo de una actividad simple de captura de la cámara: http://labs.makemachine.net/2010/03/simple-android-photo-capture/

Tal vez deberías intentar arreglar la orientación haciendo algo como esto:

ExifInterface exif = new ExifInterface(_path); int exifOrientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int rotate = 0; switch (exifOrientation) { case ExifInterface.ORIENTATION_ROTATE_90: rotate = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: rotate = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: rotate = 270; break; } if (rotate != 0) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); // Setting pre rotate Matrix mtx = new Matrix(); mtx.preRotate(rotate); // Rotating Bitmap & convert to ARGB_8888, required by tess bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false); bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); }

Escribí una actividad de cámara personalizada para manejar algunos problemas que he tenido con ciertos dispositivos Android al llamar a la captura de imágenes con intención. El usuario puede seleccionar guardar imagen o simplemente usar los datos devueltos desde OnPictureTakenCallback .

El problema que tengo es mostrar la imagen correctamente con respecto a la orientación que se tomó. SetRequestedOrientation la actividad para que se muestre en retrato llamando a SetRequestedOrientation .

¿Cómo sabría la Orientación correcta en la que estaba la cámara cuando el usuario tomó la fotografía? es decir, el usuario podría tomar la foto con una rotación de 90 (vertical).

Intenté utilizar getRotation() en la pantalla predeterminada del administrador de ventanas, pero estableciendo la orientación solicitada en vertical que solo devuelve Surface.ROTATION_0 .

Actualización: Para aclarar mi otro problema, ¿cómo podría determinar la orientación solo de los datos del byte[] en la devolución de llamada de la imagen si el usuario no guardara la imagen?

Actualización: Después de intentar las siguientes respuestas con este código, todo lo que obtengo es ExifInterface.ORIENTATION_NORMAL. También cambié mi código para guardar el archivo devuelto por la cámara, ya que no estoy seguro de que haya una manera fácil de determinar la orientación con solo tener los datos de byte[] .

private PictureCallback mPicture = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { File directory = new File(android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_PICTURES), "MyApp"); if(!directory.exists()) { if(!directory.mkdirs()) { Log.d("CAMERA", "Unable to create directory to save photos."); return; } } File file = new File(directory.getPath() + file.separator + "IMG_" + SimpleDateFormat.getDateTimeInstance().toString() + ".jpg"); FileOutputStream fos = new FileOutputStream(file); fos.write(data); fos.close(); ExifInterface exif = new ExifInterface(file.getCanonicalPath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int rotate = 0; switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: rotate = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: rotate = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: rotate = 270; break; case default: break; } } };


La eliminación de setRequestedOrientation() permitió getWindowManager().getDefaultDisplay().getRotation() para dar la rotación correcta. Supongo que establecer la orientación solicitada evita que la actividad se vuelva a dibujar cuando la configuración cambia, por lo que el dispositivo no sabe que se modificó ningún tipo de rotación. Mi único problema ahora es cambiar del modo horizontal a 0 grados de orientación al modo horizontal 180 grados de rotación no activa esto:

@Override public void onConfigurationChanged(Configuration newconfig) { super.onConfigurationChanged(newconfig); }


public void surfaceCreated(SurfaceHolder holder) { try { mCamera.setPreviewDisplay(holder); Camera.Parameters parameters = mCamera.getParameters(); if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) { parameters.set("orientation", "portrait"); <----THis gets the job done!!! // For Android Version 2.2 and above mCamera.setDisplayOrientation(90); // For Android Version 2.0 and above parameters.setRotation(90); } // End Effects for Android Version 2.0 and higher mCamera.setParameters(parameters); } catch (IOException exception) { mCamera.release(); } }


Deberá leer los metadatos del JPEG original para verificar la orientación en la que se tomó la imagen.

ExifInterface exif = new ExifInterface(SourceFileName); String exifOrientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION);

Fuente: ¿Cómo determinar la orientación de la imagen sin ExifInterface?

Editar: respondiendo a su edición, ¿ha intentado utilizar el método getCameraInfo () que está disponible con el objeto Cámara pasado en la devolución de llamada? ¿Tiene la información que necesita?

Fuente: http://developer.android.com/reference/android/hardware/Camera.html