在向应用添加预览时,请使用 PreviewView,这是一种可以剪裁、缩放和旋转以确保正确显示的 View。
当相机处于活动状态时,图片预览会流式传输到 PreviewView 中的 Surface。
使用 PreviewView
如需使用 PreviewView 实现 CameraX 预览,请按以下步骤操作(稍后将对这些步骤进行说明):
将 PreviewView 添加到布局。
在创建 View 时,请检查 ProcessCameraProvider。
选择相机并绑定生命周期和用例。
使用 PreviewView 存在一些限制。使用 PreviewView 时,您无法执行以下任何操作:
创建 SurfaceTexture,以在 TextureView 和 Preview.SurfaceProvider 上进行设置。
从 TextureView 检索 SurfaceTexture,并在 Preview.SurfaceProvider 上对其进行设置。
从 SurfaceView 获取 Surface,并在 Preview.SurfaceProvider 上对其进行设置。
如果出现上述任何一种情况,Preview 就会停止将帧流式传输到 PreviewView。
[可选] 配置 CameraXConfig.Provider
如果您希望对初始化 CameraX 的时间进行精细控制,您可以在 Application 类中实现 CameraXConfig.Provider 接口。请注意,大多数应用并不需要这种级别的控制。
Kotlin
import androidx.camera.camera2.Camera2Config
import androidx.camera.core.CameraXConfig
public class MyCameraXApplication : Application(), CameraXConfig.Provider {
override fun getCameraXConfig(): CameraXConfig {
return Camera2Config.defaultConfig()
}
}Java
import androidx.camera.camera2.Camera2Config;
import androidx.camera.core.CameraXConfig;
public class MyCameraXApplication extends Application implements CameraXConfig.Provider {
@NonNull
@Override
public CameraXConfig getCameraXConfig() {
return Camera2Config.defaultConfig();
}
}
将 PreviewView 添加到布局
以下示例显示了布局中的 PreviewView:
android:id="@+id/container">
android:id="@+id/previewView" />
请求 CameraProvider
以下代码展示了如何请求 CameraProvider:
Kotlin
import androidx.camera.lifecycle.ProcessCameraProvider
import mon.util.concurrent.ListenableFuture
class MainActivity : AppCompatActivity() {
private lateinit var cameraProviderFuture : ListenableFuture
override fun onCreate(savedInstanceState: Bundle?) {
cameraProviderFuture = ProcessCameraProvider.getInstance(this)
}
}Java
import androidx.camera.lifecycle.ProcessCameraProvider
import mon.util.concurrent.ListenableFuture
public class MainActivity extends AppCompatActivity {
private ListenableFuture cameraProviderFuture;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
cameraProviderFuture = ProcessCameraProvider.getInstance(this);
}
}
检查 CameraProvider 可用性
请求 CameraProvider 后,请验证它能否在视图创建后成功初始化。以下代码展示了如何执行此操作:
Kotlin
cameraProviderFuture.addListener(Runnable {
val cameraProvider = cameraProviderFuture.get()
bindPreview(cameraProvider)
}, ContextCompat.getMainExecutor(this))Java
cameraProviderFuture.addListener(() -> {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
bindPreview(cameraProvider);
} catch (ExecutionException | InterruptedException e) {
// No errors need to be handled for this Future.
// This should never be reached.
}
}, ContextCompat.getMainExecutor(this));
如需查看此示例中使用的 bindPreview 函数的示例,请参阅下一部分中提供的代码。
选择相机并绑定生命周期和用例
创建并确认 CameraProvider 后,请执行以下操作:
创建 Preview。
指定所需的相机 LensFacing 选项。
将所选相机和任意用例绑定到生命周期。
将 Preview 连接到 PreviewView。
以下代码展示了一个示例:
Kotlin
fun bindPreview(cameraProvider : ProcessCameraProvider) {
var preview : Preview = Preview.Builder()
.build()
var cameraSelector : CameraSelector = CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build()
preview.setSurfaceProvider(previewView.getSurfaceProvider())
var camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
}Java
void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {
Preview preview = new Preview.Builder()
.build();
CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build();
preview.setSurfaceProvider(previewView.getSurfaceProvider());
Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview);
}
现在,您已完成实现相机预览的操作。请构建您的应用,然后确认预览是否出现在您的应用中并能按预期工作。
其他资源
如需详细了解 CameraX,请参阅下面列出的其他资源。
Codelab
代码示例