簡體   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