自定义相机
上一篇讲的是调用系统相机拍照然后显示在屏幕上,自定义一个相机就是自己相机的activity。
1,首先是要创建camera的生命周期
getCamera();//获取Camera对象
setStartPreview(Camera camera,SurfaceHolder holder);//预览相机内容
releaseCamera();//释放相机资源
2,activity生命周期与camera绑定
protected void onResume() {
super.onResume();
if (mCamera == null) {
mCamera = getCamera();
if (mHolder != null) {
setStartPreview(mCamera,mHolder);
}
}
}
protected void onPause() {
super.onPause();
releaseCamera();
}
3,camera与surfaceview绑定
//预览图像与camera绑定
@Override
public void surfaceCreated(SurfaceHolder holder) {
setStartPreview(mCamera,mHolder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
mCamera.stopPreview();
setStartPreview(mCamera,mHolder);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();
}
4,声明相机使用权限
<uses-permission android:name="android.permission.CAMERA"</uses-permission>
5,实现照相,通过回调将照片数据保存到文件,并将文件路径传递到其它activity(ResultAty);
private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {//data中存储照片的全部信息
File tempFile = new File("/sdacrd/temp.png");
try {
FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(data);
fos.close();
Intent intent = new Intent(CustomCamera.this,ResultAty.class);
intent.putExtra("picPath",tempFile.getAbsolutePath());
startActivity(intent);
CustomCamera.this.finish();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};
public void capture(View view){
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPictureFormat(ImageFormat.JPEG);//设置拍照格式jpg格式
parameters.setPictureSize(800,400);//设置照片大小
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);//设置自动对焦
mCamera.autoFocus(new Camera.AutoFocusCallback() { //回调,对焦最清晰时拍照
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
mCamera.takePicture(null,null,mPictureCallback);
}
}
});
}
创建CustomCamera类实现拍照功能(全部代码)
import android.app.Activity;
import android.hardware.Camera;
//导入android.hardware.Camera而不是android.graphics.Camera
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import java.io.IOException;
/**
* Created by 方 on 2017/2/24.
*/
public class CustomCamera extends Activity implements SurfaceHolder.Callback{
private Camera mCamera;
private SurfaceView mPreview;
private SurfaceHolder mHolder;
private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {//data中存储照片的全部信息
File tempFile = new File("/sdacrd/temp.png");
try {
FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(data);
fos.close();
Intent intent = new Intent(CustomCamera.this,ResultAty.class);
intent.putExtra("picPath",tempFile.getAbsolutePath());
startActivity(intent);
CustomCamera.this.finish();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom);
mPreview = (SurfaceView) findViewById(R.id.preview);
mHolder = mPreview.getHolder();
mHolder.addCallback(this);
}
//Camera生命周期与Activity生命周期绑定
@Override
protected void onResume() {
super.onResume();
if (mCamera == null) {
mCamera = getCamera();
if (mHolder != null) {
setStartPreview(mCamera,mHolder);
}
}
}
@Override
protected void onPause() {
super.onPause();
releaseCamera();
}
//Button事件实现照相,通过回调将照片数据保存到文件,并将文件路径传递到其它activity;
public void capture(View view){
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPictureFormat(ImageFormat.JPEG);//设置拍照格式jpg格式
parameters.setPictureSize(800,400);//设置照片大小
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);//设置自动对焦
mCamera.autoFocus(new Camera.AutoFocusCallback() { //回调,对焦最清晰时拍照
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
mCamera.takePicture(null,null,mPictureCallback);
}
}
});
}
//获取Camera对象
private Camera getCamera(){
Camera camera = null;
try {
camera = Camera.open();
} catch (Exception e) {
e.printStackTrace();
}
return camera;
}
//开始预览相机内容
private void setStartPreview(Camera camera,SurfaceHolder holder){
try {
camera.setPreviewDisplay(holder);
//旋转90度
camera.setDisplayOrientation(90);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
//释放相机资源
private void releaseCamera(){
if (mCamera != null) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
//预览图像与camera绑定
@Override
public void surfaceCreated(SurfaceHolder holder) {
setStartPreview(mCamera,mHolder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
mCamera.stopPreview();
setStartPreview(mCamera,mHolder);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();
}
}
网友评论