如何调用设备摄像头进行拍照、预览并将拍摄结果保存在媒体库中(Camera)("如何使用Camera API调用设备摄像头进行拍照、预览及保存至媒体库")
原创怎样使用Camera API调用设备摄像头进行拍照、预览及保存至媒体库
在移动应用开发中,调用设备摄像头进行拍照和预览是常见的需求。本文将详细介绍怎样使用Camera API在Android设备上实现这一功能,并将拍摄因此保存在媒体库中。
一、权限申请
在进行摄像头操作之前,首先需要申请必要的权限。在Android 6.0(API级别23)及以上版本中,需要在运行时动态申请权限。以下是所需的权限:
// 写入存储权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_STORAGE);
}
// 摄像头权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA);
}
二、初始化Camera API
在Android中,可以使用Camera类来操作摄像头。首先,需要获取Camera实例,并进行配置。
// 获取摄像头实例
Camera camera = Camera.open();
if (camera == null) {
// 摄像头无法打开
return;
}
// 设置摄像头参数
Camera.Parameters parameters = camera.getParameters();
parameters.setPictureFormat(ImageFormat.JPEG);
parameters.setPreviewSize(640, 480);
camera.setParameters(parameters);
// 设置摄像头预览
SurfaceView surfaceView = findViewById(R.id.camera_preview);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// 在这里重新设置摄像头参数
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(640, 480);
camera.setParameters(parameters);
camera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
}
});
三、拍照功能实现
在预览界面中,可以添加一个按钮用于拍照。在点击按钮时,调用Camera类的takePicture方法进行拍照。
// 拍照按钮点击事件
Button captureButton = findViewById(R.id.button_capture);
captureButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
camera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 处理拍照因此
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
saveImageToGallery(bitmap);
camera.startPreview();
}
});
}
});
四、保存图片至媒体库
拍照完成后,可以将图片保存至媒体库中,以便在其他应用中查看。以下是保存图片至媒体库的代码:
public void saveImageToGallery(Bitmap bitmap) {
// 获取媒体库的ContentResolver
ContentResolver resolver = getContentResolver();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "image_" + System.currentTimeMillis() + ".jpg");
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/Camera");
Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
try {
OutputStream outputStream = resolver.openOutputStream(imageUri);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
五、注意事项
1. 在使用Camera API时,需要注意线程平安问题。拍照和预览操作应该在主线程中执行。
2. 在Android 9(API级别28)及以上版本中,媒体库的访问方案出现了变化。请使用MediaStore API进行操作。
3. 在实际开发中,大概需要依设备的摄像头硬件能力来调整摄像头参数,例如赞成的分辨率、对焦模式等。
4. 为了尽大概减少损耗用户体验,可以在拍照过程中添加动画效果,如拍照按钮的震动反馈。
5. 适当处理异常情况,如摄像头无法打开、拍照落败等。
六、总结
本文详细介绍了怎样使用Camera API调用设备摄像头进行拍照、预览及保存至媒体库。通过掌握这些技术,开发者可以轻松实现移动应用中的摄像头功能。在实际开发过程中,还需要注意权限申请、线程平安、摄像头参数调整等方面的问题,以确保应用的稳定性和用户体验。