大家好,這是一個簡單的拍照功能,很簡單的介面,一個顯示映像地區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;@Overridepublic 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 componentssurfaceHolder = surfaceView.getHolder(); // Camera interface to instantiate componentssurfaceHolder.addCallback(surfaceCallback); // Add a callback for the SurfaceHoldersurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);btnSave = (Button) findViewById(R.id.save_pic);btnSave.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {takePic();}});}@Overridepublic 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 previewcamera.takePicture(null, null, pictureCallback); // picture}// Photo call backCamera.PictureCallback pictureCallback = new Camera.PictureCallback() {//@Overridepublic void onPictureTaken(byte[] data, Camera camera) {new SavePictureTask().execute(data);camera.startPreview();}};// save picclass SavePictureTask extends AsyncTask<byte[], String, String> {@Overrideprotected 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 filepicture = new File(Environment.getExternalStorageDirectory()+"/"+fname);try {FileOutputStream fos = new FileOutputStream(picture.getPath()); // Get file output streamfos.write(params[0]); // Written to the filefos.close(); } catch (Exception e) {e.printStackTrace();}return null;}}// SurfaceHodler Callback handle to open the camera, off camera and photo size changesSurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {public void surfaceCreated(SurfaceHolder holder) {Log.i(TAG, "surfaceCallback====");camera = Camera.open(); // Turn on the cameratry {camera.setPreviewDisplay(holder); // Set Preview} catch (IOException e) {camera.release();// release cameracamera = null;}}public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {Log.i(TAG,"====surfaceChanged");Camera.Parameters parameters = camera.getParameters(); // Camera parameters to obtainparameters.setPictureFormat(PixelFormat.JPEG);// Setting Picture Format//parameters.set("rotation", 180); // Arbitrary rotationcamera.setDisplayOrientation(0);//parameters.setPreviewSize(400, 300); // Set Photo Sizecamera.setParameters(parameters); // Setting camera parameterscamera.startPreview(); // Start Preview}public void surfaceDestroyed(SurfaceHolder holder) {Log.i(TAG,"====surfaceDestroyed");camera.stopPreview();// stop previewcamera.release(); // Release camera resourcescamera = 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