Frage

Ich bin eine Vorschau mit angezeigt werden, was die Kamera sehen, die auf dem Bildschirm.

Ich kann alles funktioniert gut bekommen, Oberfläche geschaffen, Oberfläche Satz und die Oberfläche angezeigt wird.

es jedoch immer zeigt das Bild in einem falschen Winkel von 90 Grad im Portrait-Modus.

Wie im Bild:

alt text

Ich bin mir bewusst, dass Sie den folgenden Code mit dem Bild gesetzt wird gerade:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Jedoch habe ich die Vorschau innerhalb einer Aktivität haben, die andere Elemente in sich hat und es macht keinen Sinn, für meine Aktivität im Querformat angezeigt werden. (Die standardmäßig deaktiviert)

Also ich frage mich, ist es trotzdem nur die Ausrichtung der Vorschau zu ändern? Und lassen Sie den Rest meiner Tätigkeit richtig im Hochformat-Modus angezeigt?

oder auf jeden Fall um die Vorschau zu drehen, so dass es korrekt angezeigt wird?

War es hilfreich?

Lösung

Dieses Problem trat als Fehler beginnen mit bestimmten Hardware hier sehen sondern kann mithilfe der Aufruf mCamera.setDisplayOrientation (Grad) in API 8. überwunden werden, so ist dies, wie ich es umsetzen:

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 hatte zunächst in jedem der Drehprüfungen der Anmeldung Aussagen setzen zu sagen, was die Rotation war und dann auf dem Gerät ausgetestet und den Logcat Ausgang beobachtet, während ich das Gerät gedreht wird. Für das HTC Desire, war 0 das Telefon, wie Sie es erwartet haben (Hochformat), 90 Grad wurde das Telefon um 90 Grad gegen den Uhrzeigersinn drehen (ich angenommen hätte, wäre es im Uhrzeigersinn gewesen). In dem Code werden zu sehen, Sie brauchte mich keine Anzeige Rotation zu tun, wenn das Telefon bei 90 oder 180 Grad war - das Gerät schien dies selbst zu behandeln. Nur ein Punkt nicht richtig funktioniert: Die 270-Grad-Drehung ist, wenn Sie das Gerät um 90 Grad im Uhrzeigersinn und die Anzeigedrehzähler, die in Ordnung, aber wenn Sie das Gerät um 270 Grad gegen den Uhrzeigersinn drehen, ist es nicht, es scheint richtig zu kompensieren <. / p>

P. S. Beachten Sie die swapover von Breite und Höhe in den entsprechenden Drehungen.

Andere Tipps

versuchen, die Anzeigeausrichtung einzustellen. Es löst mein Problem.

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

versuchen, diesen Code

Ich hatte ein Problem mit Frontkamera (Upside down Ausgabe). Dann habe ich die folgende Methode dokumentiert in 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);


    }

Ich habe es Ratschläge von mCamera.setDisplayOrientation unter (90); aber gedreht auch die Bitmap aus irgendeinem Grunde, weil die andere nicht funktionieren für mich Ansätze in der Version 2.3.3.

Für drehen sich die Bitmap Ich tat dies:

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

Ich habe meinen Code zum Tutorial verglichen und was schließlich fixiert wurde den folgenden Code in meine AndroidManifext.xml setzen: Im <activity> Tag:

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();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top