Slide 1

Slide 1 text

CameraX Divya Jain Mobile@Gametime divyajain2405 Ease of camera utility in your apps

Slide 2

Slide 2 text

Variety of apps that use Camera Basic Photos SOCIAL INTERACTION IMAGE ANALYSIS SCANNING Filters and Special E ects

Slide 3

Slide 3 text

WHY CAMERAX ● Jetpack support library ● Backward compatibility ● Use-case based approach ● Lifecycle aware ● No device specific code ● CameraX Extensions

Slide 4

Slide 4 text

Use Case BAsed Approach ● Preview ● Image analysis ● Image Capture

Slide 5

Slide 5 text

LIBRARY API Configuration ● Use Case with configurations ● Listeners for output data ● Lifecycle aware flow

Slide 6

Slide 6 text

Image Capture Example //Configure val imageCapture = ImageCapture.Builder() .setTargetResolution(Size(600, 800)).build() //Lifecycle Binding CameraX.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture) //Use-case with Output Listener imageCapture.takePicture(file, executor, object : ImageCapture.OnImageSavedListener {...})

Slide 7

Slide 7 text

GETTING STARTED WITH CAMERAX Min Version Requirements: ● Android API level 21 ● Android Architecture Components 1.1.1 Build.gradle: repositories { google() jcenter() } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } dependencies { def camerax_version = "1.0.0-beta03" implementation "androidx.camera:camera-camera2:${camerax_version}" implementation "androidx.camera:camera-lifecycle:${camerax_version" implementation "androidx.camera:camera-view:1.0.0-alpha10" implementation "androidx.camera:camera-extensions:1.0.0-alpha10" }

Slide 8

Slide 8 text

USE CASE PREVIEW fun buildPreviewUseCase(): Preview { return Preview.Builder() .setTargetResolution(resolution). .setTargetRotation(rotation) .build() } val surfaceProvider = previewView.createSurfaceProvider(cameraInfo) preview.setSurfaceProvider(surfaceProvider) var camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)

Slide 9

Slide 9 text

USE CASE IMAGE ANALYSIS fun buildImageAnalysisUseCase(): ImageAnalysis { return ImageAnalysis.Builder() .setTargetAspectRatio(aspectRatio) .setTargetRotation(rotation) .setBackpressureStrategy(strategy) .setImageQueueDepth(queueDepth) .build() } private class LuminosityAnalyzer : ImageAnalysis.Analyzer { override fun analyze(image: ImageProxy) { } }

Slide 10

Slide 10 text

BACKPRESSURESTRATEGY ● STRATEGY_BLOCK_PRODUCER ● STRATEGY_KEEP_ONLY_LATEST

Slide 11

Slide 11 text

USE CASE IMAGE CAPTURE val imageCapture = ImageCapture.Builder() setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) .build() fun onClick() { val outputFileOptions = ImageCapture.OutputFileOptions.Builder(File(...)) imageCapture.takePicture(outputFileOptions, cameraExecutor, object : ImageCapture.OnImageSavedCallback { override fun onError(error: ImageCaptureException) {...} override fun onImageSaved(outputFileResults:ImageCapture.OutputFileResults) {...} }) } ImageCapture.Builder.setIoExecuter(executor)

Slide 12

Slide 12 text

ADVANCED FEATURES ● Tap to Focus ● Pinch to Zoom ● Linear Zoom Slider

Slide 13

Slide 13 text

EXTENSIONS import androidx.camera.extensions.BokehExtender fun onCreate() { val builder = ImageCapture.Builder() // Create an Extender object which can be used to apply extension val bokehImageCapture = BokehImageCaptureExtender.create(builder) val cameraSelector = CameraSelector.Builder) .requireLensFacing(CameraX.LensFacing.BACK) .build() // Query if extension is available (optional). if (bokehImageCapture.isExtensionAvailable()) { // Enable the extension if available. bokehImageCapture.enableExtension() } // Finish constructing configuration with the same flow as when not using extensions. val useCase = ImageCapture.Builder().build() cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, useCase) }

Slide 14

Slide 14 text

Live DEMO https://github.com/android/camera-sam ples/tree/master/CameraXBasic https://developer.android.com/training/camerax

Slide 15

Slide 15 text

Thank you! Divya Jain Mobile@Gametime divyajain2405 Questions?