cameraview

by cameraview on July 21st, 2010

camera

Syntax: Java
Show lines - Hide lines - Show in textbox - Download
/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
package com.zougla;
 
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
 
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Toast;
 
// ----------------------------------------------------------------------
 
public class CameraPreview extends Activity  {
	private Preview mPreview;
 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
 
		// Hide the window title.
		requestWindowFeature(Window.FEATURE_NO_TITLE);
 
		// Create our Preview view and set it as the content of our activity.
		mPreview = new Preview(this,this);		
		setContentView(mPreview);
		mPreview.setOnClickListener(new OnClickListener() {
 
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(!mPreview.onProgress)
				mPreview.onClick();
			}
		});
	}
 
}
 
// ----------------------------------------------------------------------
 
class Preview extends SurfaceView implements SurfaceHolder.Callback {
 
	SurfaceHolder mHolder;
	Camera mCamera;
	Context CON; 
	Activity ACT;
	public boolean onProgress=false;
	Preview(Context context,Activity activity) {
		super(context);
		CON=context;
		ACT=activity;
		// Install a SurfaceHolder.Callback so we get notified when the
		// underlying surface is created and destroyed.
		mHolder = getHolder();
		mHolder.addCallback(this);
		mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}
 
	public void surfaceCreated(SurfaceHolder holder) {
		// The Surface has been created, acquire the camera and tell it where
		// to draw.
		mCamera = Camera.open();
		try {
			mCamera.setPreviewDisplay(holder);
		} catch (IOException exception) {
			mCamera.release();
			mCamera = null;
			// TODO: add more exception handling logic here
		}
	}
 
	public void surfaceDestroyed(SurfaceHolder holder) {
		// Surface will be destroyed when we return, so stop the preview.
		// Because the CameraDevice object is not a shared resource, it's very
		// important to release it when the activity is paused.
		mCamera.stopPreview();
		mCamera.release();
		mCamera = null;
	}
 
	private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
		final double ASPECT_TOLERANCE = 0.05;
		double targetRatio = (double) w / h;
		if (sizes == null)
			return null;
 
		Size optimalSize = null;
		double minDiff = Double.MAX_VALUE;
 
		int targetHeight = h;
 
		// Try to find an size match aspect ratio and size
		for (Size size : sizes) {
			double ratio = (double) size.width / size.height;
			if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
				continue;
			if (Math.abs(size.height - targetHeight) < minDiff) {
				optimalSize = size;
				minDiff = Math.abs(size.height - targetHeight);
			}
		}
 
		// Cannot find the one match the aspect ratio, ignore the requirement
		if (optimalSize == null) {
			minDiff = Double.MAX_VALUE;
			for (Size size : sizes) {
				if (Math.abs(size.height - targetHeight) < minDiff) {
					optimalSize = size;
					minDiff = Math.abs(size.height - targetHeight);
				}
			}
		}
		return optimalSize;
	}
 
	Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
		public void onPictureTaken(byte[] imageData, Camera c) {
			onProgress=true;
			if (imageData != null) {
 
				Intent mIntent = new Intent();
				try {
					FileOutputStream out = new FileOutputStream(
							"/sdcard/Deltio1.jpg");
					Bitmap e = BitmapFactory.decodeByteArray(imageData, 0,
							imageData.length);
					e.compress(Bitmap.CompressFormat.JPEG, 65, out);
					out.close();			
					Intent i = new Intent(ACT, MediaSend.class);
					ACT.startActivity(i);
 
 
				} catch (Exception e) {
					Toast
					.makeText(
							CON,
							"Πρόβλημα στην αποθήκευση.Βεβαιωθείτε ότι έχετε sdcard εγκατεστημένη",
							Toast.LENGTH_LONG).show();
					ACT.finish();
				}
 
				// FileUtilities.StoreByteImage(mContext, imageData,
				// 50, "ImageName");								
 
				SystemClock.sleep(2000);
				mCamera.startPreview();
 
				onProgress=false;
 
 
 
				// setResult(FOTO_MODE,mIntent);
				// finish();
 
			}
		}
	};
 
	public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
		// Now that the size is known, set up the camera parameters and begin
		// the preview.
		Camera.Parameters parameters = mCamera.getParameters();		
 
		//List<Size> sizes = parameters.getSupportedPreviewSizes();
		//Size optimalSize = getOptimalPreviewSize(sizes, w, h);
		//parameters.setPreviewSize(optimalSize.width, optimalSize.height);
		parameters.setPreviewSize(w, h);
		//mCamera.setParameters(parameters);
		mCamera.startPreview();
	}
 
	public void onClick() {
		if(!onProgress)
		mCamera.takePicture(null, mPictureCallback, mPictureCallback);
 
	}
 
}

Leave a Reply

Note: XHTML is allowed. Your email address will never be published.

Subscribe to this comment feed via RSS