利用Camera与Surface结合的一个自动对焦拍照Demo

来源:互联网 发布:windows摄像头驱动 编辑:程序博客网 时间:2024/04/28 08:29

附上配置文件权限:

    <!--使用摄像头权限  -->    <uses-permission android:name="android.permission.CAMERA"/>    <!--设置SD卡写入权限  -->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>    <!--声明使用Camera意图  -->    <uses-feature android:name="android.hardware.camera"/>    <!--声明调用Camera自动对焦功能  -->    <uses-feature android:name="android.hardware.camera.autofocus"/>


package com.mao.maodemo;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import com.mao.maodemo.base.ActivityBase;import android.app.AlertDialog;import android.content.DialogInterface;import android.graphics.Bitmap;import android.graphics.Bitmap.CompressFormat;import android.graphics.BitmapFactory;import android.graphics.ImageFormat;import android.graphics.Point;import android.hardware.Camera;import android.hardware.Camera.AutoFocusCallback;import android.hardware.Camera.PictureCallback;import android.hardware.Camera.ShutterCallback;import android.os.Build;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.view.WindowManager;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;/** *  * 测试Camera 拍照以及预览功能 * 当为预览状态时直接打开Camera显示预览画面 * 用户点击拍照保存,生成文件 *  * @author Ming * @date   2014 下午1:59:02 */public class ActivityCameraTest extends ActivityBase implements OnClickListener{public static final String TAG="ActivityCameraTest";private SurfaceView mSurfaceView;private SurfaceHolder mHolder;private Camera      mCamera;private Button mButton_take;private Button mButton_cancle;private WindowManager mWindowManager;private Point mPoint;private boolean isPreview; //是否为预览状态@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_camera_test);mWindowManager=getWindowManager();mPoint=new Point();mWindowManager.getDefaultDisplay().getSize(mPoint);init();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_camera_test, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}private void init(){mSurfaceView=(SurfaceView) findViewById(R.id.main_surfaceview);mButton_take=(Button) findViewById(R.id.take_photo);mButton_cancle=(Button) findViewById(R.id.cancle_photo);//设置改SurfaceView 不需要自己维护缓冲区  此方法以及过时if(Build.VERSION.SDK_INT<Build.VERSION_CODES.JELLY_BEAN){mSurfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);}mButton_take.setOnClickListener(this);mHolder=mSurfaceView.getHolder();mHolder.addCallback(new Callback() {@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if(null!=mCamera){mCamera.stopPreview();}}@Overridepublic void surfaceCreated(SurfaceHolder holder) {//打开摄像头initCamera();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}});}@Overridepublic void onClick(View v) {if(mButton_take.getId()==v.getId()){takePhoto();}else if(mButton_cancle.getId()==v.getId()){}}private void initCamera(){if(!isPreview){//控制打开摄像头文件//设置参数为0时表示打开后置摄像头//默认直接Open时表示的是打开后置摄像头  也可直接设置为1 打开前置摄像头 //*************需要注意一点是在一般手机上不支持前置摄像头自动对焦功能。*************mCamera=Camera.open(1);//设置显示的角度mCamera.setDisplayOrientation(90);}if(null!=mCamera&&!isPreview){Camera.Parameters mParameters=mCamera.getParameters();mParameters.setPreviewSize(mPoint.x,mPoint.y);mParameters.setPictureSize(mPoint.x,mPoint.y);//设置帧数浮动值mParameters.setPreviewFpsRange(4, 10);//设置预览的图片格式mParameters.setPreviewFormat(ImageFormat.JPEG);mParameters.set("jpeg-quality", 85);try {mCamera.setPreviewDisplay(mHolder);mCamera.startPreview();} catch (IOException e) {e.printStackTrace();}//判断是否预览isPreview=true;}}private void takePhoto(){if(null!=mCamera){mCamera.autoFocus(new AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {//当对角成功时进行拍照if(success){mCamera.takePicture(new ShutterCallback() {@Overridepublic void onShutter() {//用户按下快门时激发此操作Toast.makeText(getApplicationContext(), "按下快门啦~", Toast.LENGTH_SHORT).show();}}, new PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {//相机获取到原始照片时激发该监听器Toast.makeText(getApplicationContext(), "获取到原始照片", Toast.LENGTH_SHORT).show();}}, new PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {//相机获取到jpg照片时激发该操作//获取到拍摄完成的照片View mView=getLayoutInflater().inflate(R.layout.preview_image, null);final Bitmap mBitmap=BitmapFactory.decodeByteArray(data, 0, data.length);ImageView mImageView=(ImageView) mView.findViewById(R.id.preview_image);mImageView.setImageBitmap(mBitmap);new AlertDialog.Builder(ActivityCameraTest.this).setView(mView).setPositiveButton("保存", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//对文件进行保存,判断Sd卡是不是已经挂载if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){File mFile=new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+".jpg");if(!mFile.exists()&&!mFile.isFile()){Log.e(TAG, "ERROR STATE");mFile.mkdirs();}FileOutputStream mOutputStream=null;try {mOutputStream=new FileOutputStream(mFile);mBitmap.compress(CompressFormat.JPEG, 100, mOutputStream);mOutputStream.flush();mOutputStream.close();} catch (FileNotFoundException e) {Log.e(TAG, "ERROR-------文件流出错");e.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else{showToast(getApplicationContext(), "Sd卡不可用,请检查后重试!");}}}).setNegativeButton("取消", null).show();//重新浏览mCamera.stopPreview();mCamera.startPreview();isPreview=true;}});}}});}}@Overrideprotected void onDestroy() {if(null!=mCamera){mCamera.release();mCamera=null;}super.onDestroy();}}

本Demo主要功能为实现自动对焦功能,结合SurfaceView预览画面。

0 0
原创粉丝点击