Image of a camera on a surface mount, Figure: Exception due to surface type

I am using SurfaceView with SurfaceHolder to start by previewing the camera in my test application.

 public class TextLocatorActivity extends Activity { private Preview pvw; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); pvw = new Preview(this); setContentView(pvw); } 

I want to use CameraPreview (comes with Samples SDK for SDK version 7). Clicking on the user interface takes a picture. Here's the Preview class:

 public class Preview extends SurfaceView implements OnClickListener, SurfaceHolder.Callback { SurfaceHolder holder; Camera cam; final static String TAG = "TextLocator:Preview"; Preview(Context context) { super(context); holder = getHolder(); holder.addCallback(this); this.setOnClickListener(this); // seems to be required (although the docs state, this enum is deprecated, as the type will be chosen automatically... holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void surfaceCreated(SurfaceHolder holder) { cam = Camera.open(); try { Camera.Parameters params = cam.getParameters(); params.set("orientation", "landscape"); Camera.Size bestSize = getBestPreviewSize(480, 320); params.setPreviewSize(bestSize.width, bestSize.height); cam.setParameters(params); // where to draw: cam.setPreviewDisplay(holder); } catch (IOException exception) { cam.release(); cam = null; // TODO: add more exception handling logic here } } private Camera.Size getBestPreviewSize(int width, int height) { // checks for supported sizes close to the demanded values - implemented. } public void surfaceDestroyed(SurfaceHolder holder) { cam.stopPreview(); cam.release(); cam = null; } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { Camera.Parameters parameters = cam.getParameters(); parameters.setPreviewSize(w, h); cam.setParameters(parameters); cam.startPreview(); } Camera.PictureCallback picCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] bytes, Camera arg1) { synchronized(holder) { Canvas c = null; try { c = holder.lockCanvas(); Paint paint = new Paint(); paint.setAntiAlias(false); paint.setARGB(200, 120, 180, 0); c.drawLine(10, 10, c.getWidth() - 10, c.getHeight() - 10, paint); } catch (Exception e) { Log.d(TAG, "Exception: " + e.getMessage()); // IllegalArguementException Surface Type is SURFACE_TYPE_PUSH_BUFFERS } finally { holder.unlockCanvasAndPost(c); } } } }; public void onClick(View v) { cam.takePicture(null, null, picCallback); } 

}

Next, I try to make some additional picture appropriate to the Canvas SurfaceHolder . So I call canvas = holder.lockCanvas() . This will IllegalArgumentException with the message:

 Surface type is SURFACE_TYPE_PUSH_BUFFERS 

Now docs report that these surface types are outdated, the set value will be ignored. However, the camera preview only works if I set the type to this particular value.

How can I achieve a Canvas drawing in a SurfaceView , the image is displayed? Or should it be placed in another layer / view?

+7
source share
1 answer

You cannot display a camera preview and draw using Canvas. You have to do one or the other.

+5
source

All Articles