大家好,这是一个简单的拍照功能,很简单的界面,一个显示图像区域SurfaceView一个“拍照”按钮。直接上代码!
1、CameraDemoActivity.java(主界面)
- package org.winplus.camera;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.Date;
- import android.app.Activity;
- import android.content.pm.ActivityInfo;
- import android.graphics.PixelFormat;
- import android.hardware.Camera;
- import android.os.AsyncTask;
- import android.os.Bundle;
- import android.os.Environment;
- import android.text.format.DateFormat;
- import android.util.Log;
- import android.view.KeyEvent;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- import android.view.View;
- import android.view.Window;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class CameraDemoActivity extends Activity{
- private final static String TAG = “CameraActivity”;
- private SurfaceView surfaceView;
- private SurfaceHolder surfaceHolder;
- private Camera camera;
- private File picture;
- private Button btnSave;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
- this.requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.main);
- setupViews();
- }
- private void setupViews(){
- surfaceView = (SurfaceView) findViewById(R.id.camera_preview); // Camera interface to instantiate components
- surfaceHolder = surfaceView.getHolder(); // Camera interface to instantiate components
- surfaceHolder.addCallback(surfaceCallback); // Add a callback for the SurfaceHolder
- surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- btnSave = (Button) findViewById(R.id.save_pic);
- btnSave.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- takePic();
- }
- });
- }
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_CAMERA
- || keyCode == KeyEvent.KEYCODE_SEARCH) {
- takePic();
- return true;
- }
- return super.onKeyDown(keyCode, event);
- }
- private void takePic() {
- camera.stopPreview();// stop the preview
- camera.takePicture(null, null, pictureCallback); // picture
- }
- // Photo call back
- Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
- //@Override
- public void onPictureTaken(byte[] data, Camera camera) {
- new SavePictureTask().execute(data);
- camera.startPreview();
- }
- };
- // save pic
- class SavePictureTask extends AsyncTask<byte[], String, String> {
- @Override
- protected String doInBackground(byte[]… params) {
- String fname = DateFormat.format(“yyyyMMddhhmmss”, new Date()).toString()+“.jpg”;
- Log.i(TAG, “fname=”+fname+“;dir=”+Environment.getExternalStorageDirectory());
- //picture = new File(Environment.getExternalStorageDirectory(),fname);// create file
- picture = new File(Environment.getExternalStorageDirectory()+“/”+fname);
- try {
- FileOutputStream fos = new FileOutputStream(picture.getPath()); // Get file output stream
- fos.write(params[0]); // Written to the file
- fos.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }
- // SurfaceHodler Callback handle to open the camera, off camera and photo size changes
- SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
- public void surfaceCreated(SurfaceHolder holder) {
- Log.i(TAG, “surfaceCallback====”);
- camera = Camera.open(); // Turn on the camera
- try {
- camera.setPreviewDisplay(holder); // Set Preview
- } catch (IOException e) {
- camera.release();// release camera
- camera = null;
- }
- }
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height) {
- Log.i(TAG,“====surfaceChanged”);
- Camera.Parameters parameters = camera.getParameters(); // Camera parameters to obtain
- parameters.setPictureFormat(PixelFormat.JPEG);// Setting Picture Format
- // parameters.set(“rotation”, 180); // Arbitrary rotation
- camera.setDisplayOrientation(0);
- // parameters.setPreviewSize(400, 300); // Set Photo Size
- camera.setParameters(parameters); // Setting camera parameters
- camera.startPreview(); // Start Preview
- }
- public void surfaceDestroyed(SurfaceHolder holder) {
- Log.i(TAG,“====surfaceDestroyed”);
- camera.stopPreview();// stop preview
- camera.release(); // Release camera resources
- camera = null;
- }
- };
- }
2、main.xml(布局文件)
- <?xml version=“1.0” encoding=“utf-8”?>
- <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
- android:layout_width=“fill_parent”
- android:layout_height=“fill_parent”
- android:orientation=“vertical” >
- <android.view.SurfaceView
- android:id=“@+id/camera_preview”
- android:layout_width=“800dip”
- android:layout_height=“600dip”
- android:layout_alignParentTop=“true”
- android:layout_centerInParent=“true”
- android:layout_gravity=“center_vertical|center_horizontal” />
- <Button
- android:id=“@+id/save_pic”
- android:layout_width=“fill_parent”
- android:layout_height=“wrap_content”
- android:text=“@string/txt_save” />
- </LinearLayout>
3、别忘了添加权限:
- <uses-permission android:name=“android.permission.CAMERA” />
- <uses-feature android:name=“android.hardware.camera” />
- <uses-feature android:name=“android.hardware.camera.autofocus” android:required=“false” />
原创文章,转载请注明出处:http://www.blog.csdn.net/tangcheng_ok