feat: Implement cornerPoints and frame for scanned codes (#2117)

* Android & TypeScript part of scanned code corner points. Scanned frame dimensions also included in callback. #2076

* TS fix. #2076

* Implement iOS parts of code scanner corner points with additional scanned frame data.

* Add example page for code scanning

* Use Point type from Point.ts

* Update package/src/CodeScanner.ts

Add parameters description to CodeScanner callback.

Co-authored-by: Marc Rousavy <marcrousavy@hotmail.com>

* Update package/src/CodeScanner.ts

More expressive description for CodeScannerFrame.

Co-authored-by: Marc Rousavy <marcrousavy@hotmail.com>

* Update package/src/CodeScanner.ts

Co-authored-by: Marc Rousavy <marcrousavy@hotmail.com>

* Update package/src/CodeScanner.ts

Co-authored-by: Marc Rousavy <marcrousavy@hotmail.com>

* Update package/ios/Core/CameraSession+CodeScanner.swift

Co-authored-by: Marc Rousavy <marcrousavy@hotmail.com>

* Update package/ios/Core/CameraSession+CodeScanner.swift

Co-authored-by: Marc Rousavy <marcrousavy@hotmail.com>

* Remove default values from CodeSCannerFrame

* Linting

* Multiply code corner points in swift

---------

Co-authored-by: stemy <balazs.stemler@metrix.co.hu>
Co-authored-by: Zoli <iamzozo@metrix.co.hu>
Co-authored-by: Marc Rousavy <marcrousavy@hotmail.com>
This commit is contained in:
Metrix Hungary Kft
2023-11-09 11:57:05 +01:00
committed by GitHub
parent 24ddca3409
commit e649aba8e1
17 changed files with 317 additions and 20 deletions

View File

@@ -7,6 +7,7 @@ import com.facebook.react.bridge.WritableMap
import com.facebook.react.uimanager.events.RCTEventEmitter
import com.google.mlkit.vision.barcode.common.Barcode
import com.mrousavy.camera.core.CameraError
import com.mrousavy.camera.core.CodeScannerFrame
import com.mrousavy.camera.core.UnknownCameraError
import com.mrousavy.camera.core.code
import com.mrousavy.camera.types.CodeType
@@ -42,7 +43,7 @@ fun CameraView.invokeOnViewReady() {
reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, "cameraViewReady", event)
}
fun CameraView.invokeOnCodeScanned(barcodes: List<Barcode>) {
fun CameraView.invokeOnCodeScanned(barcodes: List<Barcode>, scannerFrame: CodeScannerFrame) {
val codes = Arguments.createArray()
barcodes.forEach { barcode ->
val code = Arguments.createMap()
@@ -58,11 +59,26 @@ fun CameraView.invokeOnCodeScanned(barcodes: List<Barcode>) {
frame.putInt("height", rect.bottom - rect.top)
code.putMap("frame", frame)
}
barcode.cornerPoints?.let { points ->
val corners = Arguments.createArray()
points.forEach { point ->
val pt = Arguments.createMap()
pt.putInt("x", point.x)
pt.putInt("y", point.y)
corners.pushMap(pt)
}
code.putArray("corners", corners)
}
codes.pushMap(code)
}
val event = Arguments.createMap()
event.putArray("codes", codes)
val codeScannerFrame = Arguments.createMap()
codeScannerFrame.putInt("width", scannerFrame.width)
codeScannerFrame.putInt("height", scannerFrame.height)
event.putMap("frame", codeScannerFrame)
val reactContext = context as ReactContext
reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, "cameraCodeScanned", event)
}

View File

@@ -11,6 +11,7 @@ import com.google.mlkit.vision.barcode.common.Barcode
import com.mrousavy.camera.core.CameraConfiguration
import com.mrousavy.camera.core.CameraQueues
import com.mrousavy.camera.core.CameraSession
import com.mrousavy.camera.core.CodeScannerFrame
import com.mrousavy.camera.core.PreviewView
import com.mrousavy.camera.extensions.installHierarchyFitter
import com.mrousavy.camera.frameprocessor.FrameProcessor
@@ -228,7 +229,7 @@ class CameraView(context: Context) :
invokeOnInitialized()
}
override fun onCodeScanned(codes: List<Barcode>) {
invokeOnCodeScanned(codes)
override fun onCodeScanned(codes: List<Barcode>, scannerFrame: CodeScannerFrame) {
invokeOnCodeScanned(codes, scannerFrame)
}
}

View File

@@ -611,6 +611,6 @@ class CameraSession(private val context: Context, private val cameraManager: Cam
interface CameraSessionCallback {
fun onError(error: Throwable)
fun onInitialized()
fun onCodeScanned(codes: List<Barcode>)
fun onCodeScanned(codes: List<Barcode>, scannerFrame: CodeScannerFrame)
}
}

View File

@@ -0,0 +1,3 @@
package com.mrousavy.camera.core
data class CodeScannerFrame(val width: Int, val height: Int)

View File

@@ -56,7 +56,7 @@ class CodeScannerPipeline(
image.close()
isBusy = false
if (barcodes.isNotEmpty()) {
callback.onCodeScanned(barcodes)
callback.onCodeScanned(barcodes, CodeScannerFrame(inputImage.width, inputImage.height))
}
}
.addOnFailureListener { error ->