📅  最后修改于: 2023-12-03 14:54:37.894000             🧑  作者: Mango
拍照是现代智能手机普遍具备的重要功能之一。使用代码实现拍照功能需要涉及到硬件调用和图片处理等步骤。
在 Android 平台中,需要使用 Camera API 来实现拍照功能。具体的实现步骤如下:
private Camera mCamera;
mCamera = getCameraInstance();
private SurfaceHolder mHolder;
mHolder = mSurfaceView.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
//停止预览
mCamera.stopPreview();
//重新设置预览大小
Camera.Parameters parameters = mCamera.getParameters();
Camera.Size size = getOptimalPreviewSize(parameters.getSupportedPreviewSizes(), width, height);
parameters.setPreviewSize(size.width, size.height);
mCamera.setParameters(parameters);
//开始预览
mCamera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//停止预览
mCamera.stopPreview();
//释放相机资源
mHolder.removeCallback(this);
mCamera.release();
mCamera = null;
}
其中,getCameraInstance()
方法用于获取 Camera 实例,mCamera.setPreviewDisplay(holder)
方法用于将预览界面输出到 SurfaceView 上。
private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
//将图片转换为 Bitmap 对象
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
//保存图片
savePicture(bitmap);
//重新开始预览
mCamera.startPreview();
}
};
public void takePicture() {
mCamera.takePicture(null, null, mPictureCallback);
}
其中,mPictureCallback
用于处理拍照后的数据。takePicture()
方法用于触发拍照动作。
在拍照完成后,需要对图片进行处理。例如,可以将图片保存到本地或者上传到服务器等。具体的实现步骤如下:
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
public void savePicture(Bitmap bitmap) {
//创建文件夹
File dir = new File(Environment.getExternalStorageDirectory(), "Pictures");
if (!dir.exists()) {
dir.mkdir();
}
//创建文件
String fileName = System.currentTimeMillis() + ".jpg";
File file = new File(dir, fileName);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
Toast.makeText(this, "保存成功!路径:" + file.getAbsolutePath(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "保存失败!" + e.getMessage(), Toast.LENGTH_SHORT).show();
} finally {
try {
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
其中,Environment.getExternalStorageDirectory()
方法用于获取外部存储路径,dir.mkdir()
方法用于创建文件夹,file.getAbsolutePath()
方法用于获取文件保存路径。
以上就是拍照的代码实现步骤。