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已經失效,必須重新設定,如果沒有作對應處理,将會出現這個問題。