2012-07-26 17 views
13

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.Problema de orientación de la imagen de Android con actividad de cámara personalizada

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

¿Cómo sabría la orientación correcta de 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).

He intentado utilizar el getRotation() en la pantalla predeterminada del administrador de ventanas, pero estableciendo la orientación solicitada en retrato que solo devuelve Surface.ROTATION_0.

Actualización: Para aclarar mi otro problema, ¿cómo podría determinar la orientación de solo los datos 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 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; 
      } 
     } 
    }; 
+0

puede alguien ayudar http://stackoverflow.com/questions/28379130/how -to-set-camera-image-orientation –

Respuesta

15

por lo que se enfrentan a algún problema con la orientación de la cámara.

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

tal vez debería intentar fijar 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); 
     } 
+0

parece funcionar para mí ... volver a pasarlo: http://labs.makemachine.net/2010/03/simple-android-photo-capture/ – Android2390

+0

He actualizado mi pregunta en respuesta a tu respuesta. – Bryan

+1

He utilizado este código para rotar la imagen en el método picturecalback pero de alguna manera no funciona, ¿me pueden ayudar? Voy a votar por la ayuda – Nitin

4

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

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

Fuente: How to determine orientation of picture without ExifInterface?

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

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

+0

Debería poder llamar a "orientación" en CameraInfo. http://developer.android.com/reference/android/hardware/Camera.CameraInfo.html – bsempe

+0

De acuerdo con los documentos, esto está disponible desde API nivel 9, es decir, Android 2.3. Mi aplicación tiene un nivel API mínimo 8. – Bryan

3

Extracción de la 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 que ahora se cambia de modo horizontal en la orientación de 0 grados a modo horizontal de 180 grados de rotación no se dispara esto:

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

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

} 
Cuestiones relacionadas