android 拍照 预览

【http://phenom.iteye.com/blog/1170616#comments 预览】

找了很多,其实这两种最普遍,一种是单张拍摄,一种连续预览。
第一种:单张:不多说看代码大家都懂:
---------------------------------------------------------------------
public class TakePicTestActivity extends Activity {
private PreViewThird pv = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
pv = new PreViewThird(this);
setContentView(pv);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return pv.onKeyDown(keyCode, event);
}

}
-------------------------------------------------------------------
public class PreViewThird extends SurfaceView implements SurfaceHolder.Callback {

private SurfaceHolder holder = null;
private Camera mCamera = null;

public PreViewThird(Context context) {
super(context);
holder = this.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

Camera.Parameters parameters = mCamera.getParameters();
List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
Size optsize = this.getOptimalPreviewSize(sizes, w, h);
// mFrameWidth = optsize.width;
// mFrameHeight = optsize.height;
parameters.setPreviewSize(optsize.width, optsize.height);
mCamera.setParameters(parameters);
mCamera.startPreview();
}

private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.05;
double targetRatio = (double) w / h;
if (sizes == null)
return null;
Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;

for (Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
// Cannot find the one match the aspect ratio, ignore the requirement
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}

public void surfaceCreated(SurfaceHolder holder) {
// 启动服务
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
CameraInfo cameraInfo = new CameraInfo();
int cameraCount = Camera.getNumberOfCameras();
if (cameraCount > 0) {
for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
Camera.getCameraInfo(camIdx, cameraInfo);
mCamera = Camera.open(camIdx);
if (mCamera != null) {
break;
}

}
}
}
if (mCamera == null) {
mCamera = Camera.open();
}

if (mCamera == null) {
return;
}
try {
mCamera.setPreviewDisplay(holder);// 设置预览
} catch (IOException e) {
mCamera.release();// 释放
mCamera = null;
}
}

public void surfaceDestroyed(SurfaceHolder holder) {
if (null != mCamera) {
mCamera.setPreviewCallback(null); // !!这个必须在前,不然退出出错
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}

public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_CAMERA) {
if (mCamera != null) {
mCamera.takePicture(null, null, pic);
}
}
return super.onKeyDown(keyCode, event);
}

// 拍照后输出图片
public Camera.PictureCallback pic = new Camera.PictureCallback() {

public void onPictureTaken(byte[] data, Camera camera) {

try {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
data.length);
File file = new File(Environment.getExternalStorageDirectory(),
"ljh.jpg");
FileOutputStream outStream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 100, outStream);
outStream.close();
//
camera.stopPreview();
camera.startPreview();

} catch (Exception e) {
}
}

};
}
已经是很全了并且可以开启前摄像头.
第二种:
http://phenom.iteye.com/blog/1170616#comments 不过这第二种暂时显示是两个surfaceview ,如果显示一个大家自己尝试

猜你喜欢

转载自ihopethatwell.iteye.com/blog/1613308