package cn.com.basic.face.base; import java.io.IOException; import java.io.OutputStream; import java.util.List; import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.hardware.Camera; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore.Images; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnTouchListener; import com.bsk.zhangbo.demoforbsk.R; public class PictureTaker extends Activity { private static final String TAG = "PICTURE_TAKER"; private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; private boolean isPreviewing; private Camera camera; private List effects; private List sizes; private String effect = Camera.Parameters.EFFECT_NONE; @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.fragment_register_camera_preview); surfaceView = (SurfaceView) findViewById(R.id.cameraSurfaceView); surfaceView.setOnTouchListener(touchListener); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(surfaceCallback); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); for (String effect : effects) menu.add(effect); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { Camera.Parameters p = camera.getParameters(); p.setColorEffect(item.getTitle().toString()); camera.setParameters(p); return true; } private SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() { @Override public void surfaceDestroyed(SurfaceHolder arg0) { camera.stopPreview(); isPreviewing = false; camera.release(); } @Override public void surfaceCreated(SurfaceHolder arg0) { camera = Camera.open(); effects = camera.getParameters().getSupportedColorEffects(); sizes = camera.getParameters().getSupportedPreviewSizes(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (isPreviewing) camera.stopPreview(); Camera.Parameters p = camera.getParameters(); p.setPreviewSize(sizes.get(0).width, sizes.get(0).height); p.setColorEffect(effect); p.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); camera.setParameters(p); try { camera.setPreviewDisplay(holder); // display using holder } catch (IOException e) { Log.v(TAG, e.toString()); } camera.startPreview(); // begin the preview isPreviewing = true; } }; Camera.PictureCallback pictureCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] imageData, Camera c) { String fileName = "Slideshow_" + System.currentTimeMillis(); ContentValues values = new ContentValues(); values.put(Images.Media.TITLE, fileName); values.put(Images.Media.DATE_ADDED, System.currentTimeMillis()); values.put(Images.Media.MIME_TYPE, "image/jpg"); Uri uri = getContentResolver().insert( Images.Media.EXTERNAL_CONTENT_URI, values); try { OutputStream outStream = getContentResolver().openOutputStream(uri); outStream.write(imageData); outStream.flush(); outStream.close(); Intent returnIntent = new Intent(); returnIntent.setData(uri); setResult(RESULT_OK, returnIntent); finish(); } catch (IOException ex) { setResult(RESULT_CANCELED); } } }; private OnTouchListener touchListener = new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { camera.takePicture(null, null, pictureCallback); return false; } }; }