表面视图相机预览



让我的SurfaceView显示我的相机预览有点麻烦。我在这里看了一些问题,谷歌了一些tuts,但我认为这可能是我这边的一个小错误,我只是没有看到。

public class RoofPitchActivity extends Activity implements SensorEventListener {
    ...
    private SurfaceView mSurfaceView;
    private SurfaceHolder mSurfaceHolder;
    private Camera mCamera;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_roof_pitch);
        initViews();
    }
    private void initViews() {
        ...         
        Preview preview = new Preview(this);
        mCamera = Camera.open();
        preview.setCamera(mCamera);
    }
    ...
    ...
    class Preview extends ViewGroup implements SurfaceHolder.Callback {
        public Preview(Context context) {
            super(context);
            mSurfaceView = (SurfaceView) findViewById(R.id.preview);
            mSurfaceView = new SurfaceView(context);
            addView(mSurfaceView);
            mSurfaceHolder = mSurfaceView.getHolder();
            mSurfaceHolder.addCallback(this);
        }
        public void setCamera(Camera camera) {
            if (mCamera == camera) {
                return;
            }
            stopPreviewAndFreeCamera();
            mCamera = camera;
            if (mCamera != null) {
                requestLayout();
                try {
                    mCamera.setPreviewDisplay(mSurfaceHolder);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                mCamera.startPreview();
            }
        }
        private void stopPreviewAndFreeCamera() {
            if (mCamera != null) {
                mCamera.stopPreview();
                mCamera.release();
                mCamera = null;
            }
        }
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            mCamera.startPreview();
        }
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            Camera.Parameters parameters = mCamera.getParameters();
            parameters.setPreviewSize(mSurfaceView.getWidth(), mSurfaceView.getHeight());
            requestLayout();
            mCamera.setParameters(parameters);
            mCamera.startPreview();
        }
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if (mCamera != null) {
                mCamera.stopPreview();
            }
        }
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
        }    
    }
}

所以当活动启动时,SurfaceView是黑色的。相机似乎没有渲染预览到SurfaceView上。我确信我遗漏了一些小的东西,或者可能只是对它的工作原理有一个根本性的误解。如果有一双新鲜的眼睛,稍加解释,我将不胜感激。由于

所以我的问题的答案最终是设备特定的。代码是可以接受的,但我用来调试的设备是Nexus 7。这意味着摄像头是正面的,对摄像头的正常调用不起作用。在这篇文章

中可以找到一个有趣和有趣的阅读
Camera.open();

不起作用。必须使用

Camera.open(0);

所以我的代码结束了相机的条件检查,现在它工作得很好。

一样
public void setCamera() {
        stopPreviewAndFreeCamera();
        PackageManager pm = getPackageManager();
        boolean backCamera = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA);
        boolean frontCamera = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT);
        if (frontCamera) {
            mCamera = Camera.open(0);
        } else if (backCamera) {
            mCamera = Camera.open();
        }
        if (mCamera != null) {
            Camera.Parameters parameters = mCamera.getParameters();
            parameters.setPreviewSize(mSurfaceView.getWidth(), mSurfaceView.getHeight());
            requestLayout();
            try {
                mCamera.setParameters(parameters);
                mCamera.setPreviewDisplay(mSurfaceHolder);
            } catch (IOException e) {
                e.printStackTrace();
            }                   
            mCamera.startPreview();
        }
}

最新更新