1

我正在使用 Zbar 以横向模式扫描二维码。我在 xml 中有一个 FrameLayout,它嵌套在 RelativeLayout 中,FrameLayout 的大小是 300dp X 200dp。我一直在谷歌上搜索两个说法,并且几乎阅读了有关此问题的所有 stackoverflow 线程。但似乎没有什么对我有用。

这是我的代码。

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder mHolder;
    private Camera mCamera;
    private PreviewCallback previewCallback;
    private AutoFocusCallback autoFocusCallback;

    public CameraPreview(Context context, Camera camera,
                         PreviewCallback previewCb,
                         AutoFocusCallback autoFocusCb) {
        super(context);


        mCamera = camera;
        previewCallback = previewCb;
        autoFocusCallback = autoFocusCb;

        /* 
         * Set camera to continuous focus if supported, otherwise use
         * software auto-focus. Only works for API level >=9.
         */
        /*
        Camera.Parameters parameters = camera.getParameters();
        for (String f : parameters.getSupportedFocusModes()) {
            if (f == Parameters.FOCUS_MODE_CONTINUOUS_PICTURE) {
                mCamera.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
                autoFocusCallback = null;
                break;
            }
        }
        */

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);

        // deprecated setting, but required on Android versions prior to 3.0
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // The Surface has been created, now tell the camera where to draw the preview.
        try {
            if(holder != null)
            {
                mCamera.setPreviewDisplay(holder);
                Camera.Parameters parameters = mCamera.getParameters();
                List<Size> sizes = parameters.getSupportedPictureSizes();
                parameters.setPictureSize(sizes.get(0).width, sizes.get(0).height); // mac dinh solution 0
                parameters.set("orientation","landscape");
                //parameters.setPreviewSize(viewWidth, viewHeight);
                List<Size> size = parameters.getSupportedPreviewSizes();
                parameters.setPreviewSize(size.get(0).width, size.get(0).height);
                mCamera.setParameters(parameters);
            }
        } catch (IOException e) {
            Log.d("DBG", "Error setting camera preview: " + e.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // Camera preview released in activity
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        /*
         * 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;
        }

        // stop preview before making changes
        try {
            mCamera.stopPreview();
        } catch (Exception e){
          // ignore: tried to stop a non-existent preview
        }

        try {
            // Hard code camera surface rotation 90 degs to match Activity view in portrait
            mCamera.setDisplayOrientation(0);

            mCamera.setPreviewDisplay(mHolder);
            mCamera.setPreviewCallback(previewCallback);
            mCamera.startPreview();
            mCamera.autoFocus(autoFocusCallback);
        } catch (Exception e){
            Log.d("DBG", "Error starting camera preview: " + e.getMessage());
        }
    }



}

任何帮助将不胜感激。

谢谢

4

2 回答 2

0

阿里是对的。你可以在这里找到我基于阿里解决方案的代码。

于 2014-03-31T09:44:59.437 回答
0

您的表面的纵横比(300dp X 200dp)似乎与您的相机 previewSize 不匹配。首先确定您的 previewSize ( parameters.getPreviewSize()) 的纵横比,然后将您的表面大小设置为相同的纵横比。当纵横比几乎相同时,拉伸应该消失。希望有帮助!

于 2013-12-30T10:59:44.290 回答