Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Overlay creation fails when starting camera preview

Tags:

android

I'm trying to draw the camera preview onto a SurfaceHolder with this code:

    @Override
    public void onCreate(SurfaceHolder surfaceHolder) {
        super.onCreate(surfaceHolder);

        Log.d(TAG, "Releasing camera first, just to make sure");
        releaseCamera();

        Log.d(TAG, "Opening Camera object.");
        mCamera = Camera.open();

        if (mCamera == null) {
            Log.d(TAG, "Camera is null.");
        }
    }

    @Override
    public void onSurfaceCreated(SurfaceHolder holder) {
        super.onSurfaceCreated(holder);
        Log.d(TAG, "Surface created.");

        try {
            if (holder == null) {
                Log.d(TAG, "SurfaceHolder is empty.");
            }

            Log.d(TAG, "Setting preview display.");
            mCamera.setPreviewDisplay(holder);

        } catch (IOException e) {
            Log.d(TAG, "IOException on setPreviewDisplay.");

            releaseCamera();
        }
    }


  @Override
    public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        super.onSurfaceChanged(holder, format, width, height);
        Log.d(TAG, "Surface changed.");

        Log.d(TAG, "Starting preview.");
        mCamera.startPreview();
    }

However, when I run the app, either on the emulator or my actual phone, I get the error "Overlay create failed - retrying" multiple times, followed by "Overlay Creation Failed!". I then get a RuntimeException, stating that "startPreview failed".

I've read through the sample code, as well as a lot of the related questions here, but no luck. I have also checked the permissions, which I think are correct. Any ideas?

Thanks in advance.

like image 941
Joseph Salisbury Avatar asked Dec 27 '22 17:12

Joseph Salisbury


2 Answers

When setting up your SurfaceHolder try setting the type to SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS:

SurfaceHolder holder = surfaceView.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

surfaceView is an instance of SurfaceView which is declared in my layout.

like image 68
donturner Avatar answered Jan 11 '23 17:01

donturner


ok.. try this... whole code in your camera App

public class CameraImage extends Activity implements SurfaceHolder.Callback,
        OnClickListener {
    static final int FOTO = 0;
    Camera camera;
    boolean previewRunning = false;
    private final Context mContext = this;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.camera_image);
        sv = (SurfaceView) findViewById(R.id.camera);
        sv.setOnClickListener(this);
        sh = sv.getHolder();
        sh.addCallback(this);
        sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    }

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

    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
        public void onPictureTaken(byte[] imageData, Camera c) {

            if (imageData != null) {

                Intent mIntent = new Intent();

                StoreByteImage(mContext, imageData, 50, "ImageName");
                camera.startPreview();

                setResult(FOTO, mIntent);
                finish();

            }
        }
    };

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onStop() {

        super.onStop();
    }

    public void surfaceCreated(SurfaceHolder holder) {

        camera = Camera.open();

    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

        // XXX stopPreview() will crash if preview is not running
        if (previewRunning) {
            camera.stopPreview();
        }

        Camera.Parameters p = camera.getParameters();
        p.setPreviewSize(w, h);
        camera.setParameters(p);
        try {
            camera.setPreviewDisplay(holder);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        camera.startPreview();
        previewRunning = true;
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        camera.stopPreview();
        previewRunning = false;
        camera.release();
    }

    private SurfaceView sv;
    private SurfaceHolder sh;

    public void onClick(View arg0) {

        camera.takePicture(null, mPictureCallback, mPictureCallback);

    }

    public static boolean StoreByteImage(Context mContext, byte[] imageData,
            int quality, String expName) {

        File sdImageMainDirectory = new File("/sdcard");
        FileOutputStream fileOutputStream = null;

        try {
            long name = new Date().getTime();

            BitmapFactory.Options options=new BitmapFactory.Options();
            options.inSampleSize = 1;

            Bitmap myImage = BitmapFactory.decodeByteArray(imageData, 0,
                    imageData.length,options);


            fileOutputStream = new FileOutputStream(sdImageMainDirectory.toString() +"/"+Long.toString(name)+".jpg");
            BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
            myImage.compress(CompressFormat.JPEG, quality, bos);

            DataModel dbModel = new DataModel(mContext);
            Calendar cal = Calendar.getInstance();
            dbModel.insertMultimedia(sdImageMainDirectory.toString() +"/"+Long.toString(name)+".jpg", Long.toString(name), cal);

            bos.flush();
            bos.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return true;
    }

}

I hope this will certainly work

like image 41
Balban Avatar answered Jan 11 '23 15:01

Balban