/* * 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.openideals.android.ui; import java.io.File; import java.io.FileOutputStream; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Activity; import android.content.Intent; import android.graphics.PixelFormat; import android.hardware.Camera; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.MenuItem; import android.view.SurfaceHolder; import android.view.SurfaceView; import com.openideals.greporter.PhotoFormActivity; import com.openideals.greporter.R; public class ImageCaptureActivity extends Activity implements SurfaceHolder.Callback, Camera.PreviewCallback { private Camera camera; private boolean isPreviewRunning = false; private SimpleDateFormat timeStampFormat = new SimpleDateFormat("yyyyMMddHHmmssSS"); private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; //private Uri target =null;// Media.EXTERNAL_CONTENT_URI; private String currentPhotoFile = null; private final static int PHOTO_WIDTH = 960;//213;//480; private final static int PHOTO_HEIGHT = 640;//350;//320; public void onCreate(Bundle icicle) { super.onCreate(icicle); Log.e(getClass().getSimpleName(), "onCreate"); getWindow().setFormat(PixelFormat.TRANSLUCENT); setContentView(R.layout.camera); surfaceView = (SurfaceView)findViewById(R.id.surface); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public boolean onCreateOptionsMenu(android.view.Menu menu) { MenuItem item = menu.add(0, 0, 0, "Take Picture"); item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { takePicture(); return true; } }); return true; } private void sendPicture () { if (currentPhotoFile != null) { Intent intent = new Intent(this, PhotoFormActivity.class); intent.putExtra("photofile", currentPhotoFile); startActivity(intent); } } private void takePicture () { camera.takePicture(mShutterCallback, null, mPictureCallbackJpeg); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } private boolean sizeSet = false; public void onPreviewFrame(byte[] data, Camera c) { if (!sizeSet) { Log.i(getClass().getSimpleName(), "preview frame RAW: " + data); Camera.Parameters params = c.getParameters(); params.setPictureFormat(PixelFormat.JPEG); params.setPictureSize(PHOTO_WIDTH,PHOTO_HEIGHT); c.setParameters(params); sizeSet = true; } } Camera.PictureCallback mPictureCallbackRaw = new Camera.PictureCallback() { public void onPictureTaken(byte[] data, Camera c) { } }; Camera.PictureCallback mPictureCallbackJpeg= new Camera.PictureCallback() { public void onPictureTaken(byte[] data, Camera c) { Log.e(getClass().getSimpleName(), "PICTURE CALLBACK JPEG: data.length = " + data.length); String filename = timeStampFormat.format(new Date()); String baseDir = "/sdcard/"; if (new File("/sdcard/dcim/Camera/").exists()) { baseDir = "/sdcard/dcim/Camera/"; } currentPhotoFile = baseDir + filename + ".jpg"; try { FileOutputStream file = new FileOutputStream(new File(currentPhotoFile)); file.write(data); sendPicture(); } catch (Exception e){ e.printStackTrace(); } } }; Camera.ShutterCallback mShutterCallback = new Camera.ShutterCallback() { public void onShutter() { Log.e(getClass().getSimpleName(), "SHUTTER CALLBACK"); Camera.Parameters params = camera.getParameters(); params.setPictureFormat(PixelFormat.JPEG); params.setPictureSize(PHOTO_WIDTH,PHOTO_HEIGHT); camera.setParameters(params); } }; public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { return super.onKeyDown(keyCode, event); } if (keyCode == KeyEvent.KEYCODE_CAMERA) { takePicture(); return true; } return false; } protected void onResume() { Log.e(getClass().getSimpleName(), "onResume"); super.onResume(); } protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } protected void onStop() { Log.e(getClass().getSimpleName(), "onStop"); super.onStop(); } public void surfaceCreated(SurfaceHolder holder) { Log.e(getClass().getSimpleName(), "surfaceCreated"); if (camera != null) { camera.stopPreview(); isPreviewRunning = false; camera.release(); } camera = Camera.open(); camera.setPreviewCallback(this); } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { Log.e(getClass().getSimpleName(), "surfaceChanged"); if (isPreviewRunning) { camera.stopPreview(); } camera.setPreviewDisplay(holder); camera.startPreview(); isPreviewRunning = true; } public void surfaceDestroyed(SurfaceHolder holder) { Log.e(getClass().getSimpleName(), "surfaceDestroyed"); camera.stopPreview(); isPreviewRunning = false; camera.release(); } }