Pregunta

Estoy utilizando una vista previa para mostrar lo que la cámara de ver en la pantalla.

que puedo conseguir trabajar muy bien todo, superficie creada, set de superficie y se muestra la superficie.

Sin embargo, siempre muestra la imagen en un ángulo de 90 grados incorrecta en el modo vertical.

Tal como en la imagen:

text alt

Soy consciente de que usando el siguiente código fijará la imagen recta:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Sin embargo, tengo la vista previa dentro de una actividad que tiene otros elementos en los mismos y que no tiene sentido para mi actividad que se mostrará en el modo horizontal. (Su desactivados por defecto)

Así que me preguntaba ¿Hay alguna forma acaba de cambiar la orientación de la vista previa? Y dejar el resto de mi actividad correctamente visualizado en modo retrato?

O de todos modos para girar la vista previa para que se visualice correctamente?

¿Fue útil?

Solución

Este problema apareció a comenzar como un error con cierto hardware ver aquí pero se puede superar mediante el uso de la llamada a mCamera.setDisplayOrientation (grados) disponibles en la API 8. Así que esta es la forma en que implementan:

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {            
    if (isPreviewRunning) {
        mCamera.stopPreview();
    }

    Parameters parameters = mCamera.getParameters();
    Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

    if(display.getRotation() == Surface.ROTATION_0) {
        parameters.setPreviewSize(height, width);                           
        mCamera.setDisplayOrientation(90);
    }

    if(display.getRotation() == Surface.ROTATION_90) {
        parameters.setPreviewSize(width, height);                           
    }

    if(display.getRotation() == Surface.ROTATION_180) {
        parameters.setPreviewSize(height, width);               
    }

    if(display.getRotation() == Surface.ROTATION_270) {
        parameters.setPreviewSize(width, height);
        mCamera.setDisplayOrientation(180);
    }

    mCamera.setParameters(parameters);
    previewCamera();                      
}

And the previewCamera method :

public void previewCamera() {        
    try {           
        mCamera.setPreviewDisplay(mSurfaceHolder);          
        mCamera.startPreview();
        isPreviewRunning = true;
    } catch(Exception e) {
        Log.d(APP_CLASS, "Cannot start preview", e);    
    }
}

Esto fue en un HTC Desire y tuve que poner inicialmente en el registro declaraciones en cada uno de los controles de rotación para decir lo que era la rotación y después se depura en el dispositivo y observó la salida LogCat mientras gira el dispositivo. Para el deseo de HTC, 0 era el teléfono como lo habría esperado (vertical), 90 grados estaba convirtiendo el teléfono 90 grados hacia la izquierda (que había asumido que habría sido en sentido horario). En el código verás que no necesitaba hacer cualquier rotación de la pantalla cuando el teléfono estaba a 90 o 180 grados - el dispositivo parecía manejar esto en sí. Sólo un punto no funciona correctamente: La rotación de 270 grados es cuando se enciende el dispositivo de 90 grados a la derecha y los contadores de rotación de pantalla que bien, pero si se gira el dispositivo 270 grados hacia la izquierda, que no parece compensar adecuadamente <. / p>

P.S. Tenga en cuenta la swapover de anchura y altura en las rotaciones apropiadas.

Otros consejos

tratar de establecer la orientación de la pantalla. Se soluciona mi problema.

 mCamera.setDisplayOrientation(90);
 public void surfaceCreated(SurfaceHolder holder) {
     mCamera = Camera.open();
     mCamera.setDisplayOrientation(90);
     try {
         mCamera.setPreviewDisplay(holder);
         mCamera.setPreviewCallback(new PreviewCallback() {

             @Override
             public void onPreviewFrame(byte[] data, Camera camera) {
             }
         });

     } catch (Exception e) {
         e.printStackTrace();
     }
}

probar este código

Yo estaba teniendo un problema con la cámara frontal (tema Al revés). Luego utiliza el siguiente método documentado en Android Docs -

public void setCameraDisplayOrientation(Activity activity , int icameraId , Camera camera1s)
    {
        CameraInfo cameraInfo = new CameraInfo();

        Camera.getCameraInfo(icameraId, cameraInfo);

        int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();

        int degrees = 0; // k

        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 (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
        {
            // cameraType=CAMERATYPE.FRONT;

            result = (cameraInfo.orientation + degrees) % 360;
            result = (360 - result) % 360; // compensate the mirror

        }
        else
        { // back-facing

            result = (cameraInfo.orientation - degrees + 360) % 360;

        }
        // displayRotate=result;
        camera.setDisplayOrientation(result);


    }

Lo hice siguiendo el consejo de mCamera.setDisplayOrientation (90); sino también girar el mapa de bits porque por alguna razón los otros enfoques no funciona para mí en la versión 2.3.3.

Para rotar el mapa de bits que hice esto:

Matrix matrix = new Matrix();
matrix.postRotate(90);
imageView1 = new ImageView(this);
Bitmap bitmap = BitmapFactory.decodeFile(files[i].getAbsolutePath());
Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
Bitmap scaledBitmap = Bitmap.createScaledBitmap(rotatedBitmap, 80, 80, true);
imageView1.setImageBitmap(scaledBitmap);

He comparado mi código para el tutorial y lo que finalmente fija que estaba poniendo el siguiente código en mi AndroidManifext.xml: En la etiqueta <activity>:

android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation">
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // If your preview can change or rotate, take care of those events here.
    // Make sure to stop the preview before resizing or reformatting it.

    if (mHolder.getSurface() == null) {
        // preview surface does not exist
        return;
    }

    try {
        mCamera.stopPreview();
    } catch (Exception e) {
        e.printStackTrace();
    }

    Camera.Parameters parameters = mCamera.getParameters();
    Display display = ((WindowManager) getContext().getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

    if (display.getRotation() == Surface.ROTATION_0) {
        parameters.setPreviewSize(h, w);
        mCamera.setDisplayOrientation(90);
    }

    if (display.getRotation() == Surface.ROTATION_90) {
        parameters.setPreviewSize(w, h);
        mCamera.setDisplayOrientation(0);
    }

    if (display.getRotation() == Surface.ROTATION_180) {
        parameters.setPreviewSize(h, w);
        mCamera.setDisplayOrientation(270);
    }

    if (display.getRotation() == Surface.ROTATION_270) {
        parameters.setPreviewSize(w, h);
        mCamera.setDisplayOrientation(180);
    }

    previewCamera();
}

public void previewCamera() {
    try {
        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();
    } catch (Exception e) {
        //Log.d(APP_CLASS, "Cannot start preview", e);
        e.printStackTrace();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top