不废话,直接上代码
package com.kelly.takepicture;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Date;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity {
private View butlayout;
private SurfaceView surfaceView;
private Camera camera;
private File jpgFile;
private Camera.Parameters parameters;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置全屏显示
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
surfaceView.getHolder().setSizeFromLayout();
surfaceView.getHolder().setKeepScreenOn(true);
surfaceView.getHolder().addCallback(new SurfaceCallback());
butlayout = findViewById(R.id.buttonlayout);
}
// 点击屏幕时,对焦和拍照按钮 出现
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
butlayout.setVisibility(ViewGroup.VISIBLE);
return true;
}
return super.onTouchEvent(event);
}
private class SurfaceCallback implements Callback {
@SuppressLint("InlinedApi")
public void surfaceCreated(SurfaceHolder holder) {
if (camera == null) {
camera = Camera.open();// 打开摄像头
try {
camera.setPreviewDisplay(holder);
initCamera();
camera.startPreview();
// camera.setDisplayOrientation(90);
// parameters.set("rotation", 90);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// 实现自动对焦
camera.autoFocus(new AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
initCamera();// 实现相机的参数初始化
camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。
}
}
});
}
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
camera.stopPreview();
camera.release();
camera = null;
}
}
}
public void takepicture(View view) {
switch (view.getId()) {
// 拍照
case R.id.but_takepic:
camera.takePicture(null, null, new MyPictureCallback());
break;
case R.id.but_autofocus:
// 对焦
camera.autoFocus(null);
break;
default:
break;
}
}
private class MyPictureCallback implements PictureCallback {
public void onPictureTaken(byte[] data, Camera camera) {
// 保存 图片
new SavePictureTask().execute(data);
camera.startPreview();
}
}
/**
* 使用异步任务 进行文件操作
*
* @author Administrator
*
*/
class SavePictureTask extends AsyncTask<byte[], String, String> {
protected String doInBackground(byte[]... params) {
String fname = DateFormat.format("yyyyMMddhhmmss", new Date())
.toString() + ".jpg";
jpgFile = new File(Environment.getExternalStorageDirectory() + "/"
+ fname);
try {
FileOutputStream fos = new FileOutputStream(jpgFile.getPath());
fos.write(params[0]);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
// 相机参数的初始化设置
@SuppressLint("InlinedApi")
private void initCamera() {
parameters = camera.getParameters();
Log.i(TAG, parameters.flatten());
parameters.setJpegThumbnailQuality(100);// 设置质量
// parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);//闪光灯
parameters
.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦
// 下面两句调整照片质量,只针对小米2S,不同手机,参数不同
// parameters.setPreviewSize(1920, 1088);
// parameters.setPictureSize(4208, 3120);
setDispaly(parameters, camera);
camera.setParameters(parameters);
camera.startPreview();
camera.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上
}
// 控制图像的正确显示方向
@SuppressWarnings("deprecation")
private void setDispaly(Camera.Parameters parameters, Camera camera) {
if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
camera.setDisplayOrientation(90);
} else {
parameters.setRotation(90);
}
}
}
源码下载:
点击打开链接
参考:http://blog.csdn.net/geekstart/article/details/13630009