Skip to content

Instantly share code, notes, and snippets.

View dcampogiani's full-sized avatar
🌴
On vacation

Daniele Campogiani dcampogiani

🌴
On vacation
View GitHub Profile
class ExtractDataUseCase(private val textRecognizer: TextRecognizer) {
suspend operator fun invoke(image: Image, rotationDegrees: Int): CardDetails {
val imageInput = InputImage.fromMediaImage(image, rotationDegrees)
val text = textRecognizer.process(imageInput).await().text
return Extractor.extractData(text) //We are going to see this shortly
}
}
<meta-data
android:name="com.google.mlkit.vision.DEPENDENCIES"
android:value="ocr" />
implementation 'com.google.android.gms:play-services-mlkit-text-recognition:16.1.0'
private fun bindUseCases(cameraProvider: ProcessCameraProvider) {
val preview = buildPreview()
val takePicture = buildTakePicture()
val cameraSelector = buildCameraSelector()
cameraProvider.bindToLifecycle(this, cameraSelector, preview, takePicture)
button.setOnClickListener {
lifecycle.coroutineScope.launchWhenResumed {
val imageProxy = takePicture.takePicture(executor)
suspend fun ImageCapture.takePicture(executor: Executor): ImageProxy {
return suspendCoroutine { continuation ->
takePicture(executor, object : ImageCapture.OnImageCapturedCallback() {
override fun onCaptureSuccess(image: ImageProxy) {
continuation.resume(image)
super.onCaptureSuccess(image)
}
private fun buildTakePicture(): ImageCapture = ImageCapture.Builder()
.setTargetRotation(previewView.display.rotation)
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lifecycle.coroutineScope.launchWhenResumed {
bindUseCases(getCameraProvider())
}
}
private fun bindUseCases(cameraProvider: ProcessCameraProvider) {
val preview = buildPreview()
private fun buildCameraSelector(): CameraSelector = CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build()
suspend fun Context.getCameraProvider(): ProcessCameraProvider =
suspendCoroutine { continuation ->
ProcessCameraProvider.getInstance(this).apply {
addListener(Runnable {
continuation.resume(get())
}, executor)
}
}
val Context.executor: Executor
private fun buildPreview(): Preview = Preview.Builder()
.build()
.apply {
setSurfaceProvider(previewView.createSurfaceProvider())
}