Using Timer to control Camera : Camera « Hardware « Android






Using Timer to control Camera

   
package app.test;

import java.io.IOException;
import java.io.OutputStream;
import android.app.Activity;
import android.content.ContentValues;
import android.content.res.Configuration;
import android.hardware.Camera;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore.Images.Media;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class Test extends Activity implements OnClickListener,
    SurfaceHolder.Callback, Camera.PictureCallback {
  SurfaceView cameraView;
  SurfaceHolder surfaceHolder;
  Camera camera;

  Button startStopButton;
  TextView countdownTextView;
  Handler timerUpdateHandler;
  boolean timelapseRunning = false;
  int currentTime = 0;
  final int SECONDS_BETWEEN_PHOTOS = 60; 
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    cameraView = (SurfaceView) this.findViewById(R.id.CameraView);
    surfaceHolder = cameraView.getHolder();
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    surfaceHolder.addCallback(this);

    countdownTextView = (TextView) findViewById(R.id.CountDownTextView);
    startStopButton = (Button) findViewById(R.id.CountDownButton);
    startStopButton.setOnClickListener(this);
    timerUpdateHandler = new Handler();
  }

  public void onClick(View v) {
    if (!timelapseRunning) {
      startStopButton.setText("Stop");
      timelapseRunning = true;
      timerUpdateHandler.post(timerUpdateTask);
    } else {
      startStopButton.setText("Start");
      timelapseRunning = false;
      timerUpdateHandler.removeCallbacks(timerUpdateTask);
    }
  }

  private Runnable timerUpdateTask = new Runnable() {
    public void run() {
      if (currentTime < SECONDS_BETWEEN_PHOTOS) {
        currentTime++;
      } else {
        camera.takePicture(null, null, null, Test.this);
        currentTime = 0;
      }

      timerUpdateHandler.postDelayed(timerUpdateTask, 1000);
      countdownTextView.setText("" + currentTime);
    }
  };

  public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    camera.startPreview();
  }

  public void surfaceCreated(SurfaceHolder holder) {
    camera = Camera.open();
    try {
      camera.setPreviewDisplay(holder);
      Camera.Parameters parameters = camera.getParameters();
      if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
        parameters.set("orientation", "portrait");
        camera.setDisplayOrientation(90);
      }
      camera.setParameters(parameters);
    } catch (IOException exception) {
      camera.release();
    }
  }

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

  public void onPictureTaken(byte[] data, Camera camera) {
    Uri imageFileUri = getContentResolver().insert(
        Media.EXTERNAL_CONTENT_URI, new ContentValues());
    try {
      OutputStream imageFileOS = getContentResolver().openOutputStream(
          imageFileUri);
      imageFileOS.write(data);
      imageFileOS.flush();
      imageFileOS.close();

      Toast t = Toast.makeText(this, "Saved JPEG!", Toast.LENGTH_SHORT);
      t.show();
    } catch (Exception e) {
      Toast t = Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT);
      t.show();
    }
    camera.startPreview();
  }
}


//layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >    
    <FrameLayout android:id="@+id/FrameLayout01" 
                 android:layout_width="wrap_content" 
                 android:layout_height="wrap_content">
        <SurfaceView android:id="@+id/CameraView" 
                     android:layout_width="fill_parent" 
                     android:layout_height="fill_parent"></SurfaceView>
        <LinearLayout android:id="@+id/LinearLayout01" 
                      android:layout_width="wrap_content" 
                      android:layout_height="wrap_content">
            <TextView android:id="@+id/CountDownTextView" 
                      android:text="10" 
                      android:textSize="100dip" 
                      android:layout_width="fill_parent" 
                      android:layout_height="wrap_content" 
                      android:layout_gravity="center_vertical|center_horizontal|center"></TextView>
            <Button android:layout_width="wrap_content" 
                    android:layout_height="wrap_content" 
                    android:id="@+id/CountDownButton" 
                    android:text="Start Timer"></Button>
        </LinearLayout>
    </FrameLayout>
</LinearLayout>

   
    
    
  








Related examples in the same category

1.Camera preview
2.Camera With Intent
3.Camera Intent
4.Media Store Camera Intent
5.Camera orientation
6.Camera Preview and Camera.getNumberOfCameras()
7.Take a snapshot
8.Take and preview Photo
9.A grid that displays a set of framed photos.