zcash-android-wallet-poc/zcash-android-wallet-app/qrecycler/src/main/java/cash/z/android/vision/BarcodeScanningProcessor.kt

70 lines
2.4 KiB
Kotlin

package cash.z.android.wallet.ui.util.vision
import android.graphics.Bitmap
import android.util.Log
import cash.z.android.wallet.ui.util.VisionProcessorBase
import com.google.android.gms.tasks.Task
import com.google.firebase.ml.vision.FirebaseVision
import com.google.firebase.ml.vision.barcode.FirebaseVisionBarcode
import com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector
import com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetectorOptions
import com.google.firebase.ml.vision.common.FirebaseVisionImage
import java.io.IOException
/** Barcode Detector Demo. */
class BarcodeScanningProcessor : VisionProcessorBase<List<FirebaseVisionBarcode>>() {
// Note that if you know which format of barcode your app is dealing with, detection will be
// faster to specify the supported barcode formats one by one, e.g.
// FirebaseVisionBarcodeDetectorOptions.Builder()
// .setBarcodeFormats(FirebaseVisionBarcode.FORMAT_QR_CODE)
// .build()
val detector: FirebaseVisionBarcodeDetector by lazy {
val options = FirebaseVisionBarcodeDetectorOptions.Builder()
.setBarcodeFormats(FirebaseVisionBarcode.FORMAT_QR_CODE)
.build()
FirebaseVision.getInstance().getVisionBarcodeDetector(options)
}
override fun stop() {
try {
detector.close()
} catch (e: IOException) {
Log.e(TAG, "Exception thrown while trying to close Barcode Detector: $e")
}
}
override fun detectInImage(image: FirebaseVisionImage): Task<List<FirebaseVisionBarcode>> {
return detector.detectInImage(image)
}
override fun onSuccess(
originalCameraImage: Bitmap?,
barcodes: List<FirebaseVisionBarcode>,
frameMetadata: FrameMetadata,
graphicOverlay: GraphicOverlay
) {
graphicOverlay.clear()
originalCameraImage?.let {
val imageGraphic = CameraImageGraphic(graphicOverlay, it)
graphicOverlay.add(imageGraphic)
}
barcodes.forEach {
val barcodeGraphic = BarcodeGraphic(graphicOverlay, it)
graphicOverlay.add(barcodeGraphic)
}
graphicOverlay.postInvalidate()
}
override fun onFailure(e: Exception) {
Log.e(TAG, "Barcode detection failed $e")
}
companion object {
private const val TAG = "BarcodeScanProc"
}
}