轻松实现相机预览 | Camera Viewfinder 全新上线
作者 / Android 开发者关系工程师 Francesco Romano
预览 (Preview)
https://developer.android.google.cn/training/camerax/preview
CaptureSession
https://developer.android.google.cn/reference/android/hardware/camera2/CameraDevice#createCaptureSession(android.hardware.camera2.params.SessionConfiguration)
不要假定应用将一直在纵向窗口中运行。Android 13 仍然支持应用固定屏幕方向的请求,但现在设备制造商可以选择覆盖应用的首选屏幕方向请求。
不要假定应用有任何固定尺寸或宽高比。即使您设置了 resizableActivity = "false",您的应用仍然可以在大屏幕设备 (>=600dp) 上以多窗口模式使用。
不要假定屏幕方向和相机方向之间存在固定关系。《Android 兼容性定义文档》中明确了相机图像传感器 "必须朝向正确方向,以便相机的长度方向与屏幕的长度方向对齐"。从 API 级别 32 开始,查询可折叠设备方向的相机客户端可以收到一个根据设备/折叠状态动态变化的值。
Android 兼容性定义文档
https://source.android.com/docs/compatibility/13/android-13-cdd#755_camera_orientation
不要假定边衬区的大小无法更改。新的任务栏会作为边衬区报告给应用,且当任务栏与手势导航一起使用时,任务栏可以动态隐藏和显示。
不要假定您的应用享有专属的相机访问权限。当您的应用处于多窗口模式时,其他应用也可以获得对相机和麦克风等共享资源的访问权限。
虽然 CameraX 已经能处理上述大多数情况,但使用 Camera2 API 实现适用于不同场景的预览可能会很复杂。我们在 "在您的相机应用中支持可调整大小的 Surface" Codelab 中介绍了这一点。
在您的相机应用中支持可调整大小的 Surface
https://developer.android.google.cn/codelabs/android-camera2-preview
隆重推出 CameraViewfinder
CameraViewfinder
https://developer.android.google.cn/reference/kotlin/androidx/camera/viewfinder/CameraViewfinder
implementation "androidx.camera:camera-viewfinder:1.3.0-alpha01"
<androidx.camera.viewfinder.CameraViewfinder
android:id="@+id/view_finder"
app:scaleType="fitCenter"
app:implementationMode="performance"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
View
https://developer.android.google.cn/reference/android/view/View
PreviewView
https://developer.android.google.cn/reference/kotlin/androidx/camera/view/PreviewView
实现模式
https://developer.android.google.cn/training/camerax/preview#implementation-mode缩放类型
https://developer.android.google.cn/training/camerax/preview#scale-type
现在该组件是布局的一部分,您仍然可以创建 CameraCaptureSession,但不提供 TextureView 或 SurfaceView 作为目标界面,而是使用 requestSurfaceAsync() 的结果。
fun startCamera(){
val previewResolution = Size(width, height)
val viewfinderSurfaceRequest =
ViewfinderSurfaceRequest(previewResolution, characteristics)
val surfaceListenableFuture =
cameraViewfinder.requestSurfaceAsync(viewfinderSurfaceRequest)
Futures.addCallback(surfaceListenableFuture, object :FutureCallback<Surface> {
override fun onSuccess(surface:Surface) {
//像往常一样使用这个界面创建 CaptureSession
}
override fun onFailure(t:Throwable) { /* 出错了 */}
}, ContextCompat.getMainExecutor(context))
}
CameraCaptureSession
https://developer.android.google.cn/reference/android/hardware/camera2/CameraCaptureSessionrequestSurfaceAsync()
https://developer.android.google.cn/reference/kotlin/androidx/camera/viewfinder/CameraViewfinder#requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest)
附加功能: 可折叠设备的布局优化
Jetpack WindowManager
https://developer.android.google.cn/jetpack/androidx/releases/window
处理姿势变化的代码
https://github.com/androidx/androidx/blob/androidx-main/camera/integration-tests/viewfindertestapp/src/main/java/androidx/camera/integration/viewfinder/CameraViewfinderFoldableFragment.kt#L583
推荐阅读