1. ホーム
  2. android

[解決済み] Androidのカメラの向きを正しく設定するには?

2023-03-31 08:13:51

質問

Android でデバイスの向きに応じてカメラの向きを設定したいのですが、何も動作していないようです。カメラ パラメータと同様に Surface も回転させようとしましたが、ポートレート モードのカメラ プレビューは常に上下逆さまになってしまいます。正しく表示するためには、時計回りに90度回転させる必要があります。以下は、現在使用しているコードで、ランドスケープ モードでのみ機能します。

    SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        camera.stopPreview();
        camera.release();
        camera = null;
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {          
        initCamera();           
    }

    private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
        final double ASPECT_TOLERANCE = 0.2;
        double targetRatio = (double) w / h;
        if (sizes == null)
            return null;

        Size optimalSize = null;
        double minDiff = Double.MAX_VALUE;

        int targetHeight = h;

        // Try to find an size match aspect ratio and size
        for (Size size : sizes) {
            Log.d(TAG, "Checking size " + size.width + "w " + size.height
                    + "h");
            double ratio = (double) size.width / size.height;
            if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
                continue;
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }

        // Cannot find the one match the aspect ratio, ignore the
        // requirement
        if (optimalSize == null) {
            minDiff = Double.MAX_VALUE;
            for (Size size : sizes) {
                if (Math.abs(size.height - targetHeight) < minDiff) {
                    optimalSize = size;
                    minDiff = Math.abs(size.height - targetHeight);
                }
            }
        }
        return optimalSize;
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        Camera.Parameters parameters = camera.getParameters();

        List<Size> sizes = parameters.getSupportedPreviewSizes();
        Size optimalSize = getOptimalPreviewSize(sizes, width, height);         
        Log.d(TAG, "Surface size is " + width + "w " + height + "h");
        Log.d(TAG, "Optimal size is " + optimalSize.width + "w " + optimalSize.height + "h");           
        parameters.setPreviewSize(optimalSize.width, optimalSize.height);           
        // parameters.setPreviewSize(width, height);            
        camera.setParameters(parameters);
        camera.startPreview();
    }
};  

どのように解決するのですか?

Google のカメラ アプリを使用して、最終的にこれを解決しました。センサーを使用して携帯電話の向きを取得し、EXIF タグを適切に設定するのです。カメラから出力される JPEG は自動的に向きを変えてはくれません。

また、カメラのプレビューはランドスケープ モードでのみ正しく機能します。アクティビティ レイアウトを縦向きにする必要がある場合は、向きセンサーからの値を使用して手動で行う必要があります。