Android使用Camera2 替代过时的Camera API

因为考虑到想要新增新的5.0以上的Camera2 API,发现变得太多,有重构的意思,还好先发现了这篇文章,目前对5.0以下的版本都没有兼容包和支持,所以建议按照文中最后一条做一下API版本判断

以下文章出自: 
https://blog.csdn.net/zxccxzzxz/article/details/53084800

英文原文: 
https://forums.developer.amazon.com/articles/2707/using-camera2-to-replace-deprecated-camera-api.html

概要

从5.0开始(API Level 21),可以完全控制安卓设备相机的新api Camera2(android.hardware.Camera2)被引入了进来。在以前的Camera api(android.hardware.Camera)中,对相机的手动控制需要更改系统才能实现,而且api也不友好。不过老的Camera API在5.0上已经过时,在未来的app开发中推荐的是Camera2 API。

L版本之前的Camera API
  • 有限的图片数据流获取方式
  • 有限相机状态信息
  • 没有手动捕获控制
Camera2 API
  • Supports 30fps full resolution with burst mode

    支持30fps的全高清连拍

  • Supports change on manual camera settings between frame capture

    支持帧之间的手动设置

  • Supports RAW image capture

    支持RAW格式的图片拍摄

  • Supports Zero Shutter Lag & Movie Snapshot

    支持快门0延迟以及电影速拍

  • Supports setting other manual camera device controls including level of Noise Cancelling 

    支持相机其他方面的手动控制包括噪音消除的级别

相机的基本使用被分成了5个主要部分
  1. CameraManager
  2. CameraDevice
  3. CameraCaptureSession
  4. CaptureRequest
  5. CaptureResult
CameraManager:

你需要记住在安卓设备上,Camera2 API的所有特性并不都总是可用的。取决于设备本身。为了检查那些特性可用,可以使用CameraCharacteristics来获得支持信心。

虽然推荐在未来的app中使用Camera2 API,但是只有Lollipop的设备商才可用,也不大可能会出现兼容老设备的包。因此在最小版本(minSdkVersion)升到21之前,你还是需要继续使用Camera API(android.hardware.Camera)。

不过你可以用下面的代码对不同的版本区别对待:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    // your code using Camera API here - is between 1-20
} else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // your code using Camera2 API here - is api 21 or higher
}

最后,在网上发现几个使用Camera API2开发的实例程序,总结一下方便后续参考:

  1. Camera2 Basic : https://github.com/googlesamples/android-Camera2Basic 
    演示如何使用Camera2 API基本功能的demo。你可以从中学会如何遍历相机设备的所有特性,显示预览照片,以及拍照。

  2. Camera2 Video:https://github.com/googlesamples/android-Camera2Video 
    这个demo演示如何使用Camera2 API录制视频。

  3. Camera2 master: http://www.eyesourcecode.com/thread-35378-1-1.html 
    使用Android L Camera2 API开发的示例应用程序,具备拍照,AWB,Flash,连拍功能

  4. LCamera http://www.eyesourcecode.com/thread-35377-1-1.html 
    L Camera是一个开源的实验性质的Camera应用程序,基于Android L提供的新API android.hardware.camera2,目前只支持在Andorid 5.0 Lollipop版本的Nexus 5和Nexus 6上运行

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Camera2 APIAndroid Studio中,你需要依赖以下库: ```gradle implementation 'androidx.camera:camera-camera2:1.0.0-beta01' ``` 您还需要具备相应的权限,例如`CAMERA`和`WRITE_EXTERNAL_STORAGE`。 使用Camera2 API需要遵循以下步骤: Step 1:检查设备是否支持相机功能 您可以使用CameraManager API进行检查。例如: ```java CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { String[] cameraIdList = manager.getCameraIdList(); for (String cameraId : cameraIdList) { CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); int facing = characteristics.get(CameraCharacteristics.LENS_FACING); if (facing == CameraCharacteristics.LENS_FACING_FRONT) { // 前置摄像头可用 } else if (facing == CameraCharacteristics.LENS_FACING_BACK) { // 后置摄像头可用 } } } catch (Exception e) { e.printStackTrace(); } ``` Step 2:打开相机设备 您可以使用`openCamera`方法打开相机设备。例如: ```java manager.openCamera(cameraId, new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice camera) { mCameraDevice = camera; } @Override public void onDisconnected(CameraDevice camera) { mCameraDevice.close(); mCameraDevice = null; } @Override public void onError(CameraDevice camera, int error) { mCameraDevice.close(); mCameraDevice = null; } }, null); ``` 请注意,您需要处理相机设备的连接,断开连接和错误事件。 Step 3:创建相机会话 您需要使用`createCaptureSession`方法创建相机会话。例如: ```java List<Surface> surfaces = new ArrayList<>(); surfaces.add(mPreviewSurface); surfaces.add(mImageReader.getSurface()); mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { mCameraCaptureSession = session; try { CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); builder.addTarget(mPreviewSurface); CaptureRequest request = builder.build(); mCameraCaptureSession.setRepeatingRequest(request, null, mBackgroundHandler); } catch (Exception e) { e.printStackTrace(); } } @Override public void onConfigureFailed(CameraCaptureSession session) { mCameraCaptureSession = null; } }, null); ``` 在相机会话创建后,您需要构建一个捕获请求并通过相机会话发送它。在这个例子中,您使用Preview目标并在后台线程上重复请求。 Step 4:拍照并保存照片 要进行拍照,您需要使用CaptureRequest.Builder并指定target为ImageReader的Surface。当图片可用时,您需要将其保存到文件中。例如: ```java CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); builder.addTarget(mImageReader.getSurface()); int rotation = getWindowManager().getDefaultDisplay().getRotation(); builder.set(CaptureRequest.JPEG_ORIENTATION, getRotation(rotation)); CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { super.onCaptureCompleted(session, request, result); File file = new File(getExternalFilesDir(null), "photo.jpg"); Image image = mImageReader.acquireLatestImage(); ByteBuffer buffer = image.getPlanes()[0].getBuffer(); try { FileOutputStream outputStream = new FileOutputStream(file); byte[] bytes = new byte[buffer.remaining()]; buffer.get(bytes); outputStream.write(bytes); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } finally { image.close(); } } }; mCameraCaptureSession.stopRepeating(); mCameraCaptureSession.abortCaptures(); mCameraCaptureSession.capture(builder.build(), captureCallback, mBackgroundHandler); ``` 在这个例子中,您使用TEMPLATE_STILL_CAPTURE模板创建CaptureRequest.Builder,并将target设置为ImageReader的Surface。然后,您定义一个捕获回调来捕获和保存图像。最后,您停止相机会话的重复请求并使用捕获请求捕获图像。 以上是使用Camera2 API的基本步骤,您可以在此基础上进行自定义和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值