/** ** Copyright (c) 2010 Ushahidi Inc ** All rights reserved ** Contact: team@ushahidi.com ** Website: http://www.ushahidi.com ** ** GNU Lesser General Public License Usage ** This file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: http://www.gnu.org/licenses/lgpl.html. ** ** ** If you have questions regarding the use of this file, please contact ** Ushahidi developers at team@ushahidi.com. ** **/ package com.ushahidi.android.app; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.content.pm.ActivityInfo; import android.hardware.Camera; import android.hardware.Camera.PictureCallback; import android.hardware.Camera.ShutterCallback; import android.os.Bundle; import android.provider.MediaStore.Images.ImageColumns; import android.provider.MediaStore.MediaColumns; import android.view.KeyEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.RelativeLayout; import com.ushahidi.android.app.util.Util; public class ImageCapture extends Activity implements SurfaceHolder.Callback { private Camera mCamera; private boolean mIsPreviewRunning = false; private SimpleDateFormat mTimeStampFormat = new SimpleDateFormat("yyyyMMddHHmmssSS"); private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; private RelativeLayout mRelativeLayout; private ShutterButton mShutterButton; private Bundle mBundle; private Intent mIntent; @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); //getWindow().setFormat(PixelFormat.TRANSLUCENT); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setContentView(R.layout.take_picture); mSurfaceView = (SurfaceView)findViewById(R.id.sur_camera); mShutterButton = (ShutterButton)findViewById(R.id.shutter_button); mRelativeLayout = (RelativeLayout)findViewById(R.id.snap_photo); mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.addCallback(this); mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mBundle = new Bundle(); mIntent = new Intent(); mShutterButton.setOnShutterButtonListener(new ShutterButton.OnShutterButtonListener() { public void onShutterButtonClick(ShutterButton b) { if (b.getId() == R.id.shutter_button) { onSnap(); } } public void onShutterButtonFocus(ShutterButton b, boolean pressed) { // TODO: Auto-generated method stub } }); mRelativeLayout.setOnClickListener(new RelativeLayout.OnClickListener() { public void onClick(View v) { mShutterButton.setEnabled(false); // For auto-focus: // mCamera.autoFocus(mAutoFocusCallback); } }); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } PictureCallback mPictureCallbackRaw = new PictureCallback() { public void onPictureTaken(byte[] data, Camera c) { // TODO: do something with raw image } }; PictureCallback mPictureCallbackJpeg = new PictureCallback() { public void onPictureTaken(byte[] data, Camera c) { mCamera.startPreview(); String filename = "ushandroid_" + Util.randomString() + ".jpg"; ImageManager.writeImage(data, filename, Preferences.savePath); mBundle.putString("name", filename); mIntent.putExtra("filename", mBundle); ImageCapture.this.setResult(RESULT_OK, mIntent); ImageCapture.this.finish(); } }; ShutterCallback mShutterCallback = new ShutterCallback() { public void onShutter() { // TODO: Do something when button is pressed. } }; // Implement auto focus /* * AutoFocusCallback mAutoFocusCallback = new AutoFocusCallback() { public * void onAutoFocus(boolean success, Camera camera) { * mShutterButton.setEnabled(true); } }; */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_CAMERA) { try { String filename = mTimeStampFormat.format(new Date()); ContentValues values = new ContentValues(); values.put(MediaColumns.TITLE, filename); values.put(ImageColumns.DESCRIPTION, "Image capture by camera"); } catch (Exception ex) { ex.printStackTrace(); } } if (keyCode == KeyEvent.KEYCODE_BACK) { return super.onKeyDown(keyCode, event); } if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_CAMERA) { mCamera.takePicture(mShutterCallback, mPictureCallbackRaw, mPictureCallbackJpeg); return true; } return false; } @Override protected void onResume() { this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); super.onResume(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } @Override protected void onStop() { super.onStop(); } public void surfaceCreated(SurfaceHolder holder) { mCamera = Camera.open(); } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { if (mIsPreviewRunning) { mCamera.stopPreview(); } Camera.Parameters p = mCamera.getParameters(); //get supported screen sizes List<Camera.Size> previewSizes = p.getSupportedPreviewSizes(); if (previewSizes != null){ Camera.Size previewSize = previewSizes.get(0); p.setPreviewSize(previewSize.width, previewSize.height); } mCamera.setParameters(p); try { mCamera.setPreviewDisplay(holder); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } mCamera.startPreview(); mIsPreviewRunning = true; } public void surfaceDestroyed(SurfaceHolder holder) { mCamera.stopPreview(); mIsPreviewRunning = false; mCamera.release(); } public void onSnap() { mCamera.takePicture(mShutterCallback, mPictureCallbackRaw, mPictureCallbackJpeg); } }