Android的 - 相机预览横盘

问题描述 投票:120回答:7

我使用的是预览显示哪些相机在屏幕上看到的。

我可以搞定一切工作正常,表面产生,表面设置,并显示在表面。

然而,始终显示在纵向模式的不正确的90度的角度的图像。

如在画面:

据我所知,使用下面的代码将直接设置图片:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

但是我有预览中有其他元素的活动中,它没有意义的,以在横向模式下显示我的活动。 (它的默认禁用)

所以我在想,反正是有只是改变预览的方向是什么?并留下我的活动的其余部分正确地显示在人像模式?

或者说,它是正确显示反正旋转预览?

android camera orientation preview portrait
7个回答
144
投票

这个问题似乎开始了与某些硬件see here一个错误,但可以通过使用(度)的API可调用mCamera.setDisplayOrientation克服8.所以我这是怎么实现它:

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

这是上的HTC Desire,我不得不把最初在日志语句中的每个旋转检查说什么转速为,然后在设备上调试,并观看了logcat的输出,而我旋转的装置。对于HTC欲望,0是手机作为你会预期(纵向),90度转向了手机90度逆时针(我曾以为它会一直顺时针方向)。在代码中你会看到我并不需要做任何屏幕旋转的时候,手机在90度或180度 - 该设备似乎这个处理本身。只有一点不正常:270度旋转,当你打开设备顺时针旋转90度,并且确定,但如果你旋转设备270度逆时针,它似乎并没有适当地补偿它的屏幕旋转计数器。

附:注意宽度和高度的适当轮换的swapover。


16
投票

尝试设置的显示方向。它解决了我的问题。

 mCamera.setDisplayOrientation(90);

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

试试这个代码


4
投票

我是有前置摄像头(倒挂问题)的问题。然后我用在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);


    }

3
投票

我这样做是考虑mCamera.setDisplayOrientation的意见(90);而且旋转的位图,因为某些原因,其他方法不工作,我在2.3.3版本。

对于旋转位图我这样做:

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

0
投票

我比较我的代码教程一个什么最终确定它是把下面的代码到我的AndroidManifext.xml:在<activity>标签:

android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation">

0
投票
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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.