如何调用设备摄像头进行拍照、预览并将拍摄结果保存在媒体库中(Camera)("如何使用Camera API调用设备摄像头进行拍照、预览及保存至媒体库")

原创
ithorizon 6个月前 (10-20) 阅读数 18 #后端开发

怎样使用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调用设备摄像头进行拍照、预览及保存至媒体库。通过掌握这些技术,开发者可以轻松实现移动应用中的摄像头功能。在实际开发过程中,还需要注意权限申请、线程平安、摄像头参数调整等方面的问题,以确保应用的稳定性和用户体验。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: 后端开发


热门