Shard
Shard

Reputation: 621

Android camera fails taking a picture every second

Let me start by saying that if image shooting interval is anything more than 1 second it works. For example taking a picture every 2 seconds works perfectly fine. But taking a picture every second sometimes throws java.lang.RuntimeException: takePicture failed. What could be causing this kind of a behaviour?

Here is the code I use and it is in Service:

@Override
public void onCreate()
{
    super.onCreate();
    prefs = getSharedPreferences("general",Context.MODE_PRIVATE);
    handler = new Handler();

    shotInterval = prefs.getInt(getString(R.string.prefs_int_imageShootingFrequency),1);

    if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
        Toast.makeText(this, "No camera on this device", Toast.LENGTH_LONG).show();
    } else {
        cameraId = findBackFacingCamera();
        if (cameraId < 0) {
            Toast.makeText(this, "No front facing camera found.",Toast.LENGTH_LONG).show();
        } else {
            camera = Camera.open(cameraId);
        }
    }

    cameraParameters = camera.getParameters();
    cameraParameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); //set camera to continuously auto-focus
    camera.setParameters(cameraParameters);

    pictureTaker.run(); // Start looping
}

Runnable pictureTaker = new Runnable() {
    @Override
    public void run() {
        try {
            takePicture();
        } finally {
            // 100% guarantee that this always happens, even if
            // your update method throws an exception
            handler.postDelayed(pictureTaker, shotInterval*1000);
        }
    }
};

private void takePicture(){
    SurfaceView view = new SurfaceView(this);
    try {
        camera.setPreviewDisplay(view.getHolder());
        camera.startPreview();
        camera.takePicture(null, null,new PhotoHandler(getApplicationContext()));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Upvotes: 1

Views: 1003

Answers (1)

Alex Cohn
Alex Cohn

Reputation: 57203

You should launch postDelayed() from the onPictureTaken() callback. You can check the system timer on call to takePicture() and reduce the delay respectively, to keep 1000ms repetition, but maybe once in a while, this delay will reach 0.

Upvotes: 1

Related Questions