繁体   English   中英

纵向模式下的相机预览方向(三星设备)

[英]Camera preview orientation in portrait mode (samsung device)

我正在使用相机显示预览。 该应用程序始终处于纵向模式(横向模式已禁用)。 相机预览总是逆时针旋转90度,我无法更改(既不能使用setDisplayOrientation也不能使用p.set(“ orientation”,“ portrait”)和p.set(“ rotation”,90))。

预览总是这样旋转还是取决于设备? 如果在人像模式下总是这样,那么我以后可以旋转图像。

我将手机放在“人像模式”下,但cameraPreview处于横向模式(即,我看到某些物体旋转了90度)。

在许多设备上均可正常运行 LG Optimus三星Galaxy S2

某些三星设备的问题(SAMSUNG GALAXY ACE DUOS)

                             /*
            Copyright Sergi Martínez (@sergiandreplace)

            Licensed under the Apache License, Version 2.0 (the "License");
            you may not use this file except in compliance with the License.
            You may obtain a copy of the License at

                http://www.apache.org/licenses/LICENSE-2.0

            Unless required by applicable law or agreed to in writing, software
            distributed under the License is distributed on an "AS IS" BASIS,
            WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
            See the License for the specific language governing permissions and
            limitations under the License.

            */

            package com.appunta.android.ui;

            import java.io.IOException;
            import java.lang.reflect.Method;

            import android.content.Context;
            import android.hardware.Camera;
            import android.util.AttributeSet;
            import android.util.Log;
            import android.view.Display;
            import android.view.Surface;
            import android.view.SurfaceHolder;
            import android.view.View;
            import android.view.SurfaceHolder.Callback;
            import android.view.SurfaceView;
            import android.view.WindowManager;

            public class CameraView extends SurfaceView implements Callback {

                Camera camera;
                SurfaceHolder previewHolder;
                private boolean isPreviewRunning;

                public CameraView(Context ctx) {
                    super(ctx);

                    init();
                }

                private void init() {
                    previewHolder = this.getHolder();
                    previewHolder.addCallback(this);
                    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
                }

                public CameraView(Context context, AttributeSet attrs) {
                    super(context, attrs);
                    init();
                }

                public CameraView(Context context, AttributeSet attrs, int defStyle) {
                    super(context, attrs, defStyle);
                    init();
                }

                public void surfaceCreated(SurfaceHolder holder) {
                    camera = Camera.open();
                    setCameraDisplayOrientation(camera);
                    try {
                        camera.setPreviewDisplay(holder);
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    camera.startPreview();
                }

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

                public void previewCamera() {
                    try {
                        camera.setPreviewDisplay(previewHolder);
                        camera.startPreview();
                        isPreviewRunning = true;
                    } catch (Exception e) {
                    }
                }

                public void surfaceDestroyed(SurfaceHolder arg0) {
                    camera.stopPreview();
                    camera.release();
                }

                public void startCamera() {
                    previewCamera();
                }

                public void stopCamera() {
                    camera.stopPreview();
                    camera.release();
                }

                protected static void setDisplayOrientation(Camera camera, int angle) {
                    Method downPolymorphic;

                    try {
                        downPolymorphic = camera.getClass().getMethod(
                                "setDisplayOrientation", new Class[] { int.class });
                        if (downPolymorphic != null)
                            downPolymorphic.invoke(camera, new Object[] { angle });
                    } catch (Exception e1) {
                    }

                }

                private void setCameraDisplayOrientation(Camera camera) {
                    // android.hardware.Camera.CameraInfo info = new
                    // android.hardware.Camera.CameraInfo();
                    // android.hardware.Camera.getCameraInfo(0, info);
                    // Display display = ((WindowManager) getContext().getSystemService(
                    // Context.WINDOW_SERVICE)).getDefaultDisplay();
                    // int rotation = display.getRotation();
                    // int degrees = 0;
                    // 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 (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                    // result = (info.orientation + degrees) % 360;
                    // result = (360 - result) % 360; // compensate the mirror
                    // } else { // back-facing
                    // result = (info.orientation - degrees + 360) % 360;
                    // }
                    // setDisplayOrientation(camera, result);

                    setDisplayOrientation(camera, 90);
                }

            }

这是我对SurfaceHolder.Callback的surfaceCreated方法的实现,可以正常工作,请检查实现中是否缺少任何内容

public void surfaceCreated(SurfaceHolder holder) {
        // The Surface has been created, acquire the camera and tell it where
        // to draw.
        try {
            Log.d(TAG, "surfaceCreated(), holder"+holder.toString());
            mCamera = null;
            mCamera = Camera.open();
            Log.d(TAG, "surfaceCreated(), mCamera="+mCamera);
            mCamera.setDisplayOrientation(90);
            mCamera.setPreviewDisplay(holder);
            Camera.Parameters params= mCamera.getParameters();
            params.set("jpeg-quality", 72);
            params.set("rotation", 90);
            params.set("orientation", "portrait");
            params.setPictureFormat(PixelFormat.JPEG);
                    mCamera.setParameters(params);
            createZoomlayout();

        } catch (Exception e) {
            Toast.makeText(CameraInterface.this,
                    " surfaceCreated " + e.getMessage(), Toast.LENGTH_LONG)
                    .show();
            e.printStackTrace();
        }
    }

用途-setDisplayOrientation(90); 如果不起作用,请回复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM