Hi there,
Using startFocusAndMetering() in CameraX 1.7+ is indeed the recommended and most reliable way to achieve exactly what you want.
Here are the details on how it works and how to set it up to replicate the default manual capture behavior:
1. Waiting for 3A Convergence and Locking: With the new setLockingMode API introduced in CameraX 1.7, you can explicitly instruct the camera to lock Auto Focus (AF), Auto Exposure (AE), and Auto White Balance (AWB) after the scan completes.
When you submit the action via startFocusAndMetering(action), the returned ListenableFuture handles the heavy lifting for you—it will wait for the regions to update and for all requested locks to be successfully acquired before it completes.
To lock all three, you can configure your FocusMeteringAction like this:
2. Because the FocusMeteringAction.Builder strictly requires at least one MeteringPoint, you cannot pass "no region". However, your instinct to use a centered point that spans the entire sensor is perfectly correct, as this mimics the default behavior of evaluating the whole scene.
You can achieve this easily using SurfaceOrientedMeteringPointFactory. By defining a 1x1 surface and placing a point in the center (0.5f, 0.5f) with a size of 1.0f, you cover the entire available area:
Passing this neutralPoint to the builder will ensure that the 3A routines evaluate the whole sensor natively without biasing toward a small localized patch. This approach translates reliably across different devices.
While your second proposed method (replicating the internal logic via Camera2Interop CaptureCallbacks and listening to TotalCaptureResult) is technically possible, it is significantly more complex and bypasses CameraX's internal state management. We recommend sticking to the startFocusAndMetering future, as it handles device-specific quirks and timeouts safely under the hood.
Hope this helps you get your multi-image capture pipeline working smoothly! Let us know if you have any other questions.