附上配置文件权限:
<!--使用摄像头权限 -->
<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; //是否为预览状态
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera_test);
mWindowManager=getWindowManager();
mPoint=new Point();
mWindowManager.getDefaultDisplay().getSize(mPoint);
init();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_camera_test, menu);
return true;
}
@Override
public 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() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(null!=mCamera){
mCamera.stopPreview();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
//打开摄像头
initCamera();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
});
}
@Override
public 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() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
//当对角成功时进行拍照
if(success){
mCamera.takePicture(new ShutterCallback() {
@Override
public void onShutter() {
//用户按下快门时激发此操作
Toast.makeText(getApplicationContext(), "按下快门啦~", Toast.LENGTH_SHORT).show();
}
}, new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
//相机获取到原始照片时激发该监听器
Toast.makeText(getApplicationContext(), "获取到原始照片", Toast.LENGTH_SHORT).show();
}
}, new PictureCallback() {
@Override
public 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() {
@Override
public 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 block
e.printStackTrace();
}
}else{
showToast(getApplicationContext(), "Sd卡不可用,请检查后重试!");
}
}
}).setNegativeButton("取消", null).show();
//重新浏览
mCamera.stopPreview();
mCamera.startPreview();
isPreview=true;
}
});
}
}
});
}
}
@Override
protected void onDestroy() {
if(null!=mCamera){
mCamera.release();
mCamera=null;
}
super.onDestroy();
}
}
本Demo主要功能为实现自动对焦功能,结合SurfaceView预览画面。