首页 > 解决方案 > 获取原始条码数据

问题描述

我想从 ImageAnalyzer.analyze 中释放值作为原始值并将其发送到另一个 Activity。它变得不像看起来那么简单,因为我不能用返回覆盖函数。我也无法制作 Toast 或在函数内部打开另一个 Activity,因为我无法在其中添加 Context。请帮忙。

 private class ImageAnalyzer : ImageAnalysis.Analyzer {
   private fun degreesToFirebaseRotation(degrees: Int): Int = when (degrees) {
        0 -> FirebaseVisionImageMetadata.ROTATION_0
        90 -> FirebaseVisionImageMetadata.ROTATION_90
        180 -> FirebaseVisionImageMetadata.ROTATION_180
        270 -> FirebaseVisionImageMetadata.ROTATION_270
        else -> throw Exception("Rotation must be 0, 90, 180, or 270.")
    }
    override fun analyze(imageProxy: ImageProxy?, degrees: Int){
        val mediaImage = imageProxy?.image
        val imageRotation = degreesToFirebaseRotation(degrees)
        if (mediaImage != null) {
            val image = FirebaseVisionImage.fromMediaImage(mediaImage, imageRotation)
            val options = FirebaseVisionBarcodeDetectorOptions.Builder().setBarcodeFormats(FirebaseVisionBarcode.FORMAT_ALL_FORMATS).build()
            val detector = FirebaseVision.getInstance().getVisionBarcodeDetector(options)
              val result=  detector.detectInImage(image) .addOnSuccessListener(){barcodes->
                  for (barcode in barcodes) {
                      val bounds = barcode.boundingBox
                      val corners = barcode.cornerPoints
                      val rawValue = barcode.rawValue
                      val valueType = barcode.valueType
                      // See API reference for complete list of supported types
                      when (valueType) {
                          FirebaseVisionBarcode.TYPE_WIFI -> {
                              val ssid = barcode.wifi!!.ssid
                              val password = barcode.wifi!!.password
                              val type = barcode.wifi!!.encryptionType
                          }
                          FirebaseVisionBarcode.TYPE_URL -> {
                              val title = barcode.url!!.title
                              val url = barcode.url!!.url
                          }
                      }
                  }

              }
                    .addOnFailureListener() {}
           }
  }

}

接下来我做了。如果我尝试使用此上下文制作 Toast,应用程序将崩溃。尝试打开另一个活动,函数 startActivity() 需要一些奇怪的参数。我不知道它需要什么捆绑

 private class ImageAnalyzer : ImageAnalysis.Analyzer {

    val liveScan=LiveScan()
    val contex=liveScan.applicationContext


    private fun degreesToFirebaseRotation(degrees: Int): Int = when (degrees) {
        0 -> FirebaseVisionImageMetadata.ROTATION_0
        90 -> FirebaseVisionImageMetadata.ROTATION_90
        180 -> FirebaseVisionImageMetadata.ROTATION_180
        270 -> FirebaseVisionImageMetadata.ROTATION_270
        else -> throw Exception("Rotation must be 0, 90, 180, or 270.")
    }
    override fun analyze(imageProxy: ImageProxy?, degrees: Int){
        val mediaImage = imageProxy?.image
        val imageRotation = degreesToFirebaseRotation(degrees)
        if (mediaImage != null) {
            val image = FirebaseVisionImage.fromMediaImage(mediaImage, imageRotation)
            val options = FirebaseVisionBarcodeDetectorOptions.Builder().setBarcodeFormats(FirebaseVisionBarcode.FORMAT_ALL_FORMATS).build()
            val detector = FirebaseVision.getInstance().getVisionBarcodeDetector(options)
              val result=  detector.detectInImage(image)
                  .addOnSuccessListener(){ barcodes->
                  for (barcode in barcodes) {
                      val bounds = barcode.boundingBox
                      val corners = barcode.cornerPoints
                      val rawValue = barcode.rawValue
                      val intent= Intent(contex,DataAnalyse::class.java).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                   startActivity(contex,intent,)

                  }
              }
                    .addOnFailureListener() {Log.d("CameraXApp", "no_barcode")}

        }
    }
}

标签: androidfirebasefirebase-mlkit

解决方案


这是我的问题,满足我的需求。至少现在。

package com.barcodescaner

import android.Manifest
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Matrix
import android.os.Bundle
import android.util.Log
import android.util.Size
import android.view.Surface
import android.view.TextureView
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.annotation.ContentView
import androidx.appcompat.app.AppCompatActivity
import androidx.camera.core.*
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat

import androidx.core.content.ContextCompat.startActivity
import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import com.google.android.gms.tasks.Task
import com.google.android.gms.vision.Detector
import com.google.android.gms.vision.barcode.Barcode
import com.google.android.gms.vision.barcode.BarcodeDetector
import com.google.firebase.FirebaseApp
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 com.google.firebase.ml.vision.common.FirebaseVisionImageMetadata
import java.nio.ByteBuffer
import java.security.AccessController.getContext
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
import android.widget.Toast.makeText as makeText1
import android.widget.Toast.makeText as makeText2
import com.barcodescaner.Post


private const val REQUEST_CODE_PERMISSIONS = 10

 const val FLAGS_FULLSCREEN =
View.SYSTEM_UI_FLAG_LOW_PROFILE or
        View.SYSTEM_UI_FLAG_FULLSCREEN or
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
        View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or
        View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION

 // This is an array of all the permission specified in the manifest.
private val REQUIRED_PERMISSIONS = arrayOf(Manifest.permission.CAMERA )


class LiveScan : AppCompatActivity() {
private val executor = Executors.newSingleThreadExecutor()
private lateinit var viewFinder: TextureView
lateinit var value:String

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_live_scan)
    if (savedInstanceState == null) {
  window.decorView.setSystemUiVisibility(FLAGS_FULLSCREEN)
        viewFinder = findViewById(R.id.view_finder)
        viewFinder.post() { startCamera() }
        viewFinder.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
            updateTransform()
        }
    }


    if (allPermissionsGranted()) {
       // val strin


    } else {
        ActivityCompat.requestPermissions(
            this, REQUIRED_PERMISSIONS,
            REQUEST_CODE_PERMISSIONS
        )
    }
 }



override fun onRequestPermissionsResult(
    requestCode: Int, permissions: Array<String>, grantResults: IntArray
) {
    if (requestCode == REQUEST_CODE_PERMISSIONS) {
        if (allPermissionsGranted()) {

        } else {
            Toast.makeText(
                this,
                "Permissions not granted by the user.",
                Toast.LENGTH_SHORT
            ).show()
            finish()
        }
    }
}

private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
    ContextCompat.checkSelfPermission(
        baseContext, it
    ) == PackageManager.PERMISSION_GRANTED
}
fun startCamera() {
    val previewConfig = PreviewConfig.Builder().apply {
        setTargetResolution(Size(640, 480))
    }.build()

    val preview = Preview(previewConfig)

    preview.setOnPreviewOutputUpdateListener {

        val parent = viewFinder.parent as ViewGroup
        parent.removeView(viewFinder)
        parent.addView(viewFinder, 0)

        viewFinder.surfaceTexture = it.surfaceTexture
        updateTransform()
    }

    val imageAnalysisConfig = ImageAnalysisConfig.Builder()
        .setTargetRotation(viewFinder.display.rotation)
        .build()




    val qrCodeAnalyzer = QrCodeAnalyzer { qrCodes ->

if (qrCodes.isNotEmpty()) {

value= qrCodes[0].toString()
val intent=Intent(baseContext,DataAnalyse::class.java)
intent.putExtra("BarcodeValue",value)
startActivity(intent)
CameraX.unbindAll()
}}

    val imageAnalyzer = ImageAnalysis(imageAnalysisConfig).apply {       setAnalyzer(executor,qrCodeAnalyzer)  }



    CameraX.bindToLifecycle(this, preview, imageAnalyzer)


}

private fun valuesSander(list:List<FirebaseVisionBarcode>){
val intent = Intent(baseContext,DataAnalyse::class.java)
    startActivity(intent)
}

private fun updateTransform() {
    // TODO: Implement camera viewfinder transformations
    val matrix = Matrix()
    val centerX = viewFinder.width / 2f
    val centerY = viewFinder.height / 2f
    val rotationDegrees = when (viewFinder.display.rotation) {
        Surface.ROTATION_0 -> 0
        Surface.ROTATION_90 -> 90
        Surface.ROTATION_180 -> 180
        Surface.ROTATION_270 -> 270
        else -> return
    }
    matrix.postRotate(-rotationDegrees.toFloat(), centerX, centerY)
    viewFinder.setTransform(matrix)
}
}





class QrCodeAnalyzer(
private val onQrCodesDetected: (qrCode: List<FirebaseVisionBarcode>) -> Unit
) : ImageAnalysis.Analyzer {
override fun analyze(image: ImageProxy, rotationDegrees: Int) {
    val options = FirebaseVisionBarcodeDetectorOptions.Builder()
        // We want to only detect QR codes.
        .setBarcodeFormats(FirebaseVisionBarcode.FORMAT_QR_CODE)
        .build()

    val detector = FirebaseVision.getInstance().getVisionBarcodeDetector(options)

    val rotation = rotationDegreesToFirebaseRotation(rotationDegrees)
    val visionImage = FirebaseVisionImage.fromMediaImage(image.image!!, rotation)
    detector.detectInImage(visionImage)
        .addOnSuccessListener { barcodes ->
            onQrCodesDetected(barcodes)

        }
        .addOnFailureListener {
            Log.e("QrCodeAnalyzer", "something went wrong", it)

        }.addOnCompleteListener{

        }
}
private fun rotationDegreesToFirebaseRotation(rotationDegrees: Int): Int {
    return when (rotationDegrees) {
        0 -> FirebaseVisionImageMetadata.ROTATION_0
        90 -> FirebaseVisionImageMetadata.ROTATION_90
        180 -> FirebaseVisionImageMetadata.ROTATION_180
        270 -> FirebaseVisionImageMetadata.ROTATION_270
        else -> throw IllegalArgumentException("Not supported")
    }
}
}

推荐阅读