【问题标题】:Surface View Camera PreviewSurface View 相机预览
【发布时间】:2014-07-18 15:30:35
【问题描述】:

让我的SurfaceView 显示我的相机预览有点麻烦。我在这里查看了一些问题,并在 Google 上搜索了一些 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。我确定我缺少一些小东西,或者这可能只是对它的工作原理的根本误解。非常感谢有一点解释的新眼睛。谢谢

【问题讨论】:

  • 你确定 SurfaceView 通过布局可见吗?它出现在其他一切的背后。 (尝试注释掉摄像头代码,然后使用 Canvas 将 Surface 填充为红色。)您当前对摄像头的处理会遇到一些问题——您真的希望它与 Activity 生命周期相关联,而不是与 Surface 生命周期相关联。 Grafika (github.com/google/grafika) 有几个例子;参见例如连续捕获。可以在source.android.com/devices/graphics/architecture.html#activity 找到讨论。

标签: android camera surfaceview


【解决方案1】:

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

找到有关此的有趣和有趣的阅读
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();
        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多