wake-up-neo.com

Android - Kameravorschau ist seitlich

Ich verwende eine Vorschau, um anzuzeigen, was die Kamera auf dem Bildschirm sieht.

Ich kann alles in Ordnung bringen, Oberfläche erstellen, Oberfläche einstellen und die Oberfläche wird angezeigt.

Im Hochformat wird das Bild jedoch immer in einem falschen Winkel von 90 Grad angezeigt.

Wie auf dem bild:

alt text

Mir ist bekannt, dass die Verwendung des folgenden Codes das Bild korrigiert:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Ich habe jedoch die Vorschau in einer Aktivität, die andere Elemente enthält, und es ist nicht sinnvoll, wenn meine Aktivität im Querformat angezeigt wird. (Es ist standardmäßig deaktiviert)

Also habe ich mich gefragt, gibt es sowieso nur die Ausrichtung der Vorschau zu ändern? Und den Rest meiner Aktivität im Hochformat korrekt anzeigen lassen?

Oder trotzdem die Vorschau drehen, damit sie richtig angezeigt wird?

122
Donal Rafferty

Dieses Problem begann als Fehler mit bestimmter Hardware siehe hier , kann jedoch mit dem in API 8 verfügbaren Aufruf von mCamera.setDisplayOrientation (degrees) behoben werden. So implementiere ich es:

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

Dies war auf einem HTC Desire und ich musste zunächst in jeder der Rotationsprüfungen Protokollierungsanweisungen eingeben, um festzustellen, wie die Rotation lautete, und dann auf dem Gerät debuggen und die logCat-Ausgabe beobachten, während ich das Gerät drehte. Für das HTC Desire war 0 das Telefon, wie Sie es erwartet hatten (Hochformat), 90 Grad drehten das Telefon um 90 Grad gegen den Uhrzeigersinn (ich hatte angenommen, es wäre im Uhrzeigersinn gewesen). Im Code sehen Sie, dass ich keine Anzeigedrehung durchführen musste, wenn sich das Telefon in einem Winkel von 90 oder 180 Grad befand - das Gerät schien dies selbst zu handhaben. Nur ein Punkt funktioniert nicht richtig: Die 270-Grad-Drehung erfolgt, wenn Sie das Gerät um 90 Grad im Uhrzeigersinn drehen und die Display-Drehung dem entgegenwirkt. Wenn Sie das Gerät jedoch um 270 Grad gegen den Uhrzeigersinn drehen, scheint dies nicht richtig zu kompensieren.

P.S. Beachten Sie das Vertauschen von Breite und Höhe in den entsprechenden Umdrehungen.

144
John J Smith

versuchen Sie, die Ausrichtung der Anzeige festzulegen. Es löst mein Problem.

 mCamera.setDisplayOrientation(90);
16
ksu
 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();
     }
}

versuchen Sie diesen Code

13
jitendra G2

Ich hatte ein Problem mit der Frontkamera (Problem mit dem Kopf). Dann habe ich die folgende Methode verwendet, die in Android Docs dokumentiert ist -

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);


    }
4
Xar E Ahmer

Ich habe den Rat von mCamera.setDisplayOrientation (90) befolgt. aber auch die Bitmap gedreht, weil aus irgendeinem Grund die anderen Ansätze für mich in Version 2.3.3 nicht funktionieren.

Für das Drehen der Bitmap habe ich folgendes gemacht:

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

Ich habe meinen Code mit dem Tutorial verglichen und schließlich wurde der folgende Code in meine AndroidManifext.xml eingefügt: In der <activity> Etikett:

Android:screenOrientation="landscape"
Android:configChanges="keyboardHidden|orientation">
0
sbaechler