Navaron Bracke

let analyzeImage return the barcode directly from native

... ... @@ -78,7 +78,7 @@ class MobileScanner(
scanner.process(inputImage)
.addOnSuccessListener { barcodes ->
if (detectionSpeed == DetectionSpeed.NO_DUPLICATES) {
val newScannedBarcodes = barcodes.mapNotNull({ barcode -> barcode.rawValue }).sorted()
val newScannedBarcodes = barcodes.mapNotNull { barcode -> barcode.rawValue }.sorted()
if (newScannedBarcodes == lastScanned) {
// New scanned is duplicate, returning
return@addOnSuccessListener
... ... @@ -424,7 +424,7 @@ class MobileScanner(
/**
* Analyze a single image.
*/
fun analyzeImage(image: Uri, analyzerCallback: AnalyzerCallback) {
fun analyzeImage(image: Uri, onSuccess: AnalyzerSuccessCallback, onError: AnalyzerErrorCallback) {
val inputImage = InputImage.fromFilePath(activity, image)
scanner.process(inputImage)
... ... @@ -432,15 +432,13 @@ class MobileScanner(
val barcodeMap = barcodes.map { barcode -> barcode.data }
if (barcodeMap.isNotEmpty()) {
analyzerCallback(barcodeMap)
onSuccess(barcodeMap)
} else {
analyzerCallback(null)
onSuccess(null)
}
}
.addOnFailureListener { e ->
mobileScannerErrorCallback(
e.localizedMessage ?: e.toString()
)
onError(e.localizedMessage ?: e.toString())
}
}
... ...
... ... @@ -3,7 +3,8 @@ package dev.steenbakker.mobile_scanner
import dev.steenbakker.mobile_scanner.objects.MobileScannerStartParameters
typealias MobileScannerCallback = (barcodes: List<Map<String, Any?>>, image: ByteArray?, width: Int?, height: Int?) -> Unit
typealias AnalyzerCallback = (barcodes: List<Map<String, Any?>>?) -> Unit
typealias AnalyzerErrorCallback = (message: String) -> Unit
typealias AnalyzerSuccessCallback = (barcodes: List<Map<String, Any?>>?) -> Unit
typealias MobileScannerErrorCallback = (error: String) -> Unit
typealias TorchStateCallback = (state: Int) -> Unit
typealias ZoomScaleStateCallback = (zoomScale: Double) -> Unit
... ...
... ... @@ -26,16 +26,19 @@ class MobileScannerHandler(
private val addPermissionListener: (RequestPermissionsResultListener) -> Unit,
textureRegistry: TextureRegistry): MethodChannel.MethodCallHandler {
private val analyzerCallback: AnalyzerCallback = { barcodes: List<Map<String, Any?>>?->
if (barcodes != null) {
barcodeHandler.publishEvent(mapOf(
"name" to "barcode",
"data" to barcodes
))
private val analyzeImageErrorCallback: AnalyzerErrorCallback = {
Handler(Looper.getMainLooper()).post {
analyzerResult?.error("MobileScanner", it, null)
analyzerResult = null
}
}
private val analyzeImageSuccessCallback: AnalyzerSuccessCallback = {
Handler(Looper.getMainLooper()).post {
analyzerResult?.success(barcodes != null)
analyzerResult?.success(mapOf(
"name" to "barcode",
"data" to it
))
analyzerResult = null
}
}
... ... @@ -236,7 +239,8 @@ class MobileScannerHandler(
private fun analyzeImage(call: MethodCall, result: MethodChannel.Result) {
analyzerResult = result
val uri = Uri.fromFile(File(call.arguments.toString()))
mobileScanner!!.analyzeImage(uri, analyzerCallback)
mobileScanner!!.analyzeImage(uri, analyzeImageSuccessCallback, analyzeImageErrorCallback)
}
private fun toggleTorch(call: MethodCall, result: MethodChannel.Result) {
... ...
... ... @@ -245,12 +245,12 @@ public class MobileScannerPlugin: NSObject, FlutterPlugin {
return
}
mobileScanner.analyzeImage(image: uiImage!, position: AVCaptureDevice.Position.back, callback: { [self] barcodes, error in
mobileScanner.analyzeImage(image: uiImage!, position: AVCaptureDevice.Position.back, callback: { barcodes, error in
if error != nil {
barcodeHandler.publishEvent(["name": "error", "message": error?.localizedDescription])
DispatchQueue.main.async {
result(false)
result(FlutterError(code: "MobileScanner",
message: error?.localizedDescription,
details: nil))
}
return
... ... @@ -258,15 +258,13 @@ public class MobileScannerPlugin: NSObject, FlutterPlugin {
if (barcodes == nil || barcodes!.isEmpty) {
DispatchQueue.main.async {
result(false)
result(nil)
}
} else {
let barcodesMap: [Any?] = barcodes!.compactMap { barcode in barcode.data }
let event: [String: Any?] = ["name": "barcode", "data": barcodesMap]
barcodeHandler.publishEvent(event)
DispatchQueue.main.async {
result(true)
result(["name": "barcode", "data": barcodesMap])
}
}
})
... ...