天天看點

Surfaceview注意點

surfaceview會根據activity的生命周期自動控制surface的生命周期,根據activity的onResume,onPause執行surfaceCreated,surfaceDestroyed。對surface的操作必須在這個生命周期内進行。

一個簡單的camera結合surfaceview使用的例子。

final SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surface);
        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                                       //Camera.CameraInfo.CAMERA_FACING_BACK,Camera.CameraInfo.CAMERA_FACING_FRONT
                camera = Camera.open();
                try {
                    camera.setPreviewDisplay(holder);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Camera.Parameters parameters = camera.getParameters();
                parameters.setPreviewSize(,);
                parameters.setPreviewFormat(ImageFormat.NV21);
                camera.setParameters(parameters);
                camera.setDisplayOrientation();
                camera.startPreview();
                Camera.Parameters parameters = camera.getParameters();
                parameters.setPreviewSize(,);
                parameters.setPreviewFormat(ImageFormat.NV21);
                camera.setParameters(parameters);
                camera.startPreview();
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

            }

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

FAQ1:沒有使用回調方法直接在oncreate裡執行camrea的預覽,最後什麼也沒顯示。

應該是底層的surface還沒建立完成,是以預覽失敗。出現app passed NULL surface錯誤。

FAQ2:按home鍵退出,再次進入黑屏沒有預覽。原有的surface已經失效,必須重新設定,如果沒有作對應處理,将會出現這個問題。