1

カメラを使用してプレビューを表示しています。アプリは常に縦向きモードです (横向きモードは無効です)。カメラのプレビューは常に反時計回りに 90 度回転し、変更できません ( setDisplayOrientation でも p.set("orientation", "portrait" ) と p.set("rotation", 90) でもない)。

プレビューは常にこのように回転しますか、それともデバイスに依存しますか? ポートレートモードでいつもこんな感じだったら、後で画像を回転させればいいだけです。

携帯電話を「ポートレート モード」で持っていますが、cameraPreview はランドスケープ モードです (つまり、何かが 90 度回転しているのが見えます)。

多くのデバイスで正常に動作します LG Optimus Samsung Galaxy S2

一部の samsung デバイスの問題 (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);
                }

            }
4

2 に答える 2