Android相机表面视图

Kit*_*aro 11 android android-camera

我正在尝试为相机创建一个表面视图,以便在相机视图中呈现在表面上.目前我在相机视图中看到的只是一个黑屏视图.我试图在谷歌和这里看,但到目前为止,我还没有找到我想要的东西.任何人都可以建议我一些想法.

Bha*_*rma 19

我写了一堂可以帮助你的课程.

    public class Preview_can_work extends Activity {
        private SurfaceView surface_view;  
        private Camera mCamera;
        SurfaceHolder.Callback sh_ob = null;
        SurfaceHolder surface_holder        = null;
        SurfaceHolder.Callback sh_callback  = null;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            getWindow().setFormat(PixelFormat.TRANSLUCENT);

            surface_view = new SurfaceView(getApplicationContext());
            addContentView(surface_view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

            if (surface_holder == null) {
                surface_holder = surface_view.getHolder();
            }

            sh_callback = my_callback();
            surface_holder.addCallback(sh_callback);
        }

            SurfaceHolder.Callback my_callback() {      
                SurfaceHolder.Callback ob1 = new SurfaceHolder.Callback() {

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

                    @Override
                    public void surfaceCreated(SurfaceHolder holder) {
                        mCamera = Camera.open();

                          try {
                               mCamera.setPreviewDisplay(holder);  
                          } catch (IOException exception) {  
                                mCamera.release();  
                                mCamera = null;  
                          }
                    }

                    @Override
                    public void surfaceChanged(SurfaceHolder holder, int format, int width,
                            int height) {
                        mCamera.startPreview();
                    }
                };
                return ob1;
        }
    }
Run Code Online (Sandbox Code Playgroud)

在您的清单文件中复制此代码以获取相机权限

<uses-permission android:name="android.permission.CAMERA"/>
Run Code Online (Sandbox Code Playgroud)

说明:

SurfaceView是一种包含SurfaceHolder的View.SurfaceHolder保持我们可以在其上显示媒体(通常是帧)的表面.

mCamera 是一个Camera对象,它将包含相机实例.

如果要保留默认的Camera实例,则只需调用即可 Camera.open();

Camera mCamera = Camera.open();
Run Code Online (Sandbox Code Playgroud)

现在您有一个开放式摄像头,或者您正在使用默认摄像头实例.现在,您需要从相机捕获帧并将其显示在曲面上.但你没有任何显示它

surface.这里surfaceView提供surfaceHoldersurfaceHolder提供surface显示相机帧.现在什么时候surface会创建三个回调函数

调用.

1. public void surfaceCreated(SurfaceHolder holder)
2. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
3. public void surfaceDestroyed(SurfaceHolder holder)
Run Code Online (Sandbox Code Playgroud)

注意: - 当您的应用程序暂停时,Surface将被销毁.

surfaceCreated: surfaceCreated是一个回调函数,将在创建曲面时调用.在此,您可以打开相机并设置其他属性.

surfaceChanged:这将在您的曲面创建时至少调用一次.之后,只要表面发生变化,就会调用它(在设备旋转中).在这里你可以

您的表面已经创建,因此开始预览.

surfaceDestroyed:每当你的表面破坏时,就会调用它.现在,如果你没有表面,那么你可以在哪里显示你的相机帧,所以我通过使用发布了相机

mCamera.release().这非常重要,因为如果您的活动暂停并且任何其他活动试图打开相机,那么它将无法打开它,因为您有

已打开相机.Camera是共享资源,因此有一次只有一个应用程序可以使用它.所以每当你打开相机时都要记住一件事,然后一直释放它.

stopPreview:当您开始预览时,相机会开始捕捉您的相框并将其显示在曲面上.现在,如果你的表面已经破坏,那么你需要停止捕获帧

从相机,所以你必须打电话mCamera.stopPreview.