// Manual exposure time (in nanoseconds) builder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, exposureNs)
// Target surfaces: Preview (SurfaceView/TextureView) + ImageReader builder.addTarget(previewSurface) builder.addTarget(imageReader.surface) camera 2 apk
| Device | API Level | Manual ISO | Long Exposure (≥2s) | RAW Support | |--------|-----------|------------|---------------------|--------------| | Pixel 6 | 31 | Full range | Yes | Yes | | Galaxy S21 | 30 | Limited (100–800) | Yes | Yes | | Moto G9 | 29 | No manual ISO | No | No | // Manual exposure time (in nanoseconds) builder
fun buildManualRequest(): CaptureRequest.Builder val builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_MANUAL) // Manual ISO (e.g., 100 - 3200) builder.set(CaptureRequest.SENSOR_SENSITIVITY, manualIso) 0.0f = infinity
implementation 'androidx.camera:camera-core:1.3.0' // optional helpers implementation 'com.google.guava:guava:31.1-android'
Not natively supported in manual mode. Workaround: Use a ImageReader with YUV_420_888 format for preview + separate capture request on shutter click. 5. Performance Optimization | Optimization | Method | |--------------|--------| | Reduce latency | Use CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG when possible | | Memory | Reuse ImageReader surfaces; avoid per-frame allocations | | Preview FPS | Set CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE | | RAW capture | Process DNG off main thread; use DngCreator efficiently | 6. Testing and Results We tested the Camera 2 APK on three devices:
// Manual focus (lens distance, 0.0f = infinity, 10.0f = macro) builder.set(CaptureRequest.LENS_FOCUS_DISTANCE, focusDistance)