Lo que estoy haciendo parece que debería ser simple, pero todavía estoy perdido después he leído cada posible respuesta de Stackoverflow puedo encontrar y en Google cada uno de los artículos que puedes encontrar.

Estoy usando una vista previa de SurfaceView y la captura de una imagen a partir de una actividad que se establece para screenOrientation=»paisaje» en mi AndroidManifest.xml.

He seguido la Cámara de muestra de código de la aplicación y pensaba que las cosas estaban trabajando hasta que traté de que mi aplicación en algunos dispositivos Motorola funcionamiento 1.5.

Tengo el OrientationEventListener ejecución de ACEPTAR y utilizar la reflexión para ver si se ajusta la rotación como tal:

final int latchedOrientation = roundOrientation(mLastOrientation + 90);

Parameters parameters = preview.camera.getParameters();

JPLog.d("Setting camera rotation = %d", latchedOrientation);
try {
    //if >= 2.0
    Method method = Camera.Parameters.class.getMethod("setRotation",
        int.class);

    if(method != null) {
        method.invoke(parameters, latchedOrientation);
    }

} catch(Throwable t) {
    //if < 2.0
    parameters.set("rotation", latchedOrientation);
}

preview.camera.setParameters(parameters);

NexusOne (OS 2.2) – de las grandes Obras. latchedOrientation = 0, la imagen ACEPTAR sin ningún tipo de rotación en el EXIF de la cabecera.

T-Mobile G1 (OS 1.6) – También funciona muy bien. latchedOrientation = 0, la imagen OK.

Motorola Backflip (OS 1.5) – Imagen girada. latchedOrientation = 0, la imagen no tiene la rotación de EXIF en ella.

Motorola CLIQ (OS 1.5) – Imagen girada. latchedOrientation = 0, la imagen no tiene la rotación de EXIF en ella.

Lo que está pasando con estos dispositivos Motorola? Yo pensaba que mi problema era el Motorola controlador de la cámara no era rotación de las imágenes, para encontrar el Sanselan EXIF de la lectura de las clases para Android, y se estaba preparando para girar por mí mismo. Lo curioso es que hay cabeceras EXIF pero no hay rotación del elemento.

Si puedo configurar la rotación manualmente a 90 grados, las imágenes salen perfectos los dispositivos Motorola, pero ahora el G1 y el NexusOne tienen las imágenes que se giran 90 grados (no lo que yo quiero). Tiene que ser algo que yo no estoy aquí.

Estoy dudando este es un 1.5 problema, o de lo contrario alguien se ha publicado información sobre ella?

4 Comentarios

  1. 10

    Esto es realmente un problema específico del dispositivo que afecta principalmente a los dispositivos Motorola. Los desarrolladores de google incluye un setDisplayOrientation llamada de la API de 8 a solucionar el problema. El principal error fue presentado aquí.

    Para aquellos que no pueden ir a la API 8, las dos soluciones comunes son:

    Reemplazar onDraw

    Reemplazar onDraw en un nivel superior ViewGroup y girar el lienzo de 90 grados para compensar la rotación. Nota hay una advertencia aquí como su toque eventos también se necesita para ser rotado.

    Usar El Modo Horizontal

    Bloqueo de la actividad a modo de paisaje, pero dibujar activos como si estuvieran en el retrato. Esto significa que no es su diseño y la orientación de sus activos de imagen para parecer que estás en el modo de retrato para que la vista se ve normal. Lamentablemente, esto hace que sea difícil utilizar el menú desde el menú horizontal.

    También he visto a gente usar una animación de controlador para rotar la vista. El inconveniente aquí es que yo no fuera capaz de superar es que la vista rotada no se estira para llenar la pantalla. Ver el respuesta por Georg para un ejemplo de aplicación.

    • Desafortunadamente no hay una buena manera de hacerlo y parece que hay un error en la Moto de la cámara de los conductores.
    • A mí me funciona en el Motorola drivers. Acabo de cambiar esta línea: mCamera.setDisplayOrientation(90); por la función de «developer.android.com/reference/android/hardware/…» con cameraid = Cámara.CameraInfo.CAMERA_FACING_FRONT
  2. 46

    Tuve este problema y he utilizado este método para capturar la imagen. (Sin necesidad de crear una cámara personalizada)

    final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
    startActivityForResult(intent, 0);

    y hizo el resto en onActivityResult(int requestCode, int resultCode, Intent data) {}

    Pero la imagen original (la Actual imagen de la tarjeta SD) fue correcta y de mapa de bits se gira cuando la fui a buscar como este.
    Mapa de bits bmp = BitmapFactory.decodeStream(..

    La solución:

        try {
            File f = new File(SD_CARD_IMAGE_PATH);
            ExifInterface exif = new ExifInterface(f.getPath());
            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
    
            int angle = 0;
    
            if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
                angle = 90;
            } 
            else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
                angle = 180;
            } 
            else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
                angle = 270;
            }
    
            Matrix mat = new Matrix();
            mat.postRotate(angle);
    
            Bitmap bmp = BitmapFactory.decodeStream(new FileInputStream(f), null, null);
            Bitmap correctBmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), mat, true);                 
        }
        catch (IOException e) {
            Log.w("TAG", "-- Error in setting image");
        }   
        catch(OutOfMemoryError oom) {
            Log.w("TAG", "-- OOM Error in setting image");
        }
    • Gran solución, sólo me ha mejorado un poco como en el caso de angle = 0 no hay necesidad de decodificar y crear un segundo mapa de bits con una rotación de 0. Esto debería, en caso de que se ejecuta en un no se efectúa dispositivo, reducir el consumo de memoria en un 50% para este proceso.
    • Como un encanto 🙂
    • no funciona para mí 🙁
    • Luchó por un tiempo con el método de rotación ya que en algunos dispositivos cuando viradas foto en el modo de retrato simple de rotación hace que la imagen se estira. La solución encontrada fue: code Matrix matrix = new Matrix(); matrix.postTranslate(-width / 2, -height / 2); matrix.postRotate(angle); matrix.postTranslate(width / 2, height / 2);
  3. 4

    Aquí está el código que he usado onActivityResult() en mi actividad. La intención fue devuelto para escoger una imagen del tipo de imagen/*. Funciona bien para mí!

    Uri imageUri = intent.getData();
                    String[] orientationColumn = {MediaStore.Images.Media.ORIENTATION};
                    Cursor cur = managedQuery(imageUri, orientationColumn, null, null, null);
                    int orientation = -1;
                    if (cur != null && cur.moveToFirst()) {
                        orientation = cur.getInt(cur.getColumnIndex(orientationColumn[0]));
                    }  
                    Matrix matrix = new Matrix();
                    matrix.postRotate(orientation);
    • Necesito capturar la imagen dentro de mi aplicación y la configuración de los parámetros como en el fragmento que he publicado en la pregunta. Pero sí sería más fácil si pudiera fuego fuera un intento de tener otra app tomar la fotografía para mí.
    • Usted puede usar este en la URI donde su aplicación almacena las imágenes tomadas con la cámara. Esto es sólo código para girar una imagen con la orientación correcta con un URI. No importa donde este.
  4. 0

    Parece que el » uso paisaje modo de sugerencia es la única cosa que realmente funciona. Parece que está bien, para que esto sea en el manifiesto, o a través de una llamada a setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) en el onCreate de la actividad.

Dejar respuesta

Please enter your comment!
Please enter your name here