大家好,这是一个简单的拍照功能,很简单的界面,一个显示图像区域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" /> 

源码下载:Android实现拍照功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

01-29 10:17