Android自定义相机拍照

引言
在Android开发中,我们经常需要使用相机功能进行拍照。系统提供了Camera和Camera2两种相机API,而自定义相机可以更加灵活地满足我们的需求。本文将介绍如何使用Android自定义相机进行拍照,并通过代码示例详细说明每个步骤。
准备工作
在开始自定义相机的开发之前,我们需要在AndroidManifest.xml文件中声明相机权限:
<uses-permission android:name="android.permission.CAMERA" />
初始化相机
在自定义相机的开发中,我们需要使用Camera类或Camera2类来操作相机。首先,我们需要初始化相机:
Camera mCamera;
...
mCamera = Camera.open();
设置相机参数
在初始化相机后,我们需要设置相机的参数,例如预览尺寸、照片尺寸、对焦模式等。下面是一个设置相机参数的示例代码:
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(640, 480);
parameters.setPictureSize(1280, 720);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
mCamera.setParameters(parameters);
创建预览界面
在拍照之前,我们需要创建一个预览界面来显示相机的预览画面。可以使用SurfaceView或TextureView来实现预览界面。下面是一个使用SurfaceView来创建预览界面的示例代码:
SurfaceView mPreview;
mPreview = findViewById(R.id.preview);
SurfaceHolder holder = mPreview.getHolder();
设置预览界面
在创建预览界面后,我们需要将相机的预览画面显示在预览界面上。下面是一个设置预览界面的示例代码:
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
mCamera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.release();
}
});
开启预览
在设置预览界面后,我们可以通过调用startPreview()方法来开启预览:
mCamera.startPreview();
拍照
在开启预览后,用户可以点击拍照按钮进行拍照。我们可以在点击事件中使用takePicture()方法来拍照:
mCamera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 处理照片数据
}
});
保存照片
在拍照后,我们可以通过onPictureTaken()方法中的照片数据来保存照片。下面是一个保存照片的示例代码:
FileOutputStream fos = null;
try {
File file = new File(Environment.getExternalStorageDirectory(), "photo.jpg");
fos = new FileOutputStream(file);
fos.write(data);
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
显示照片
在保存照片后,我们可以将照片显示在界面上。下面是一个显示照片的示例代码:
ImageView mPhotoImageView;
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/photo.jpg");
mPhotoImageView.setImageBitmap(bitmap);
释放相机资源
在不再需要使用相机时,我们需要释放相机资源:
mCamera.stopPreview
















