【问题标题】:Get Raw Barcode data获取原始条码数据
【发布时间】:2020-01-28 12:32:03
【问题描述】:

我想从 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")}

        }
    }
}

【问题讨论】:

  • 我不会说 Kotlin,但在 Java 中 ImageAnalyzer 可以有一个 ImageAnalyzerClient 接口,另一个类将实现该接口并将其自身提供给 ImageAnalyzer 作为 ImageAnalyzerClient 的实例。该接口将有一个从ImageAnalyzer 接收数据的方法。看起来这里有一个简短的教程,首先在“Java 方式”中在 Kotlin 中执行此操作,然后以“Kotlin 方式”:https://proandroiddev.com/kotlin-functions-an-alternative-to-interfaces-7cfb3c435900
  • 听起来很有趣。我明天试试。谢谢
  • 即使它是接收数据的方法,我也不知道在哪里调用它。从 addOnSuccesListener 获取数据到字符串或数组似乎是不可能的。在示例中,我看不到他们如何提取数据。这一切都那么悲伤(((
  • 我只有一个想法:尝试在片段中使用 camerax。当我记得将数据从片段返回到活动时,我不需要上下文?
  • “我不知道在哪里调用它。”你想从ImageAnalyzer.analyze()发送rawValue,所以你在ImageAnalyzer.analyze()调用它一次rawValue有被设置为一个值。除了你写了“将它发送到另一个活动” 并尝试使用Intent 来启动另一个Activity,所以我想我不太确定确切的用例了。在 for 循环中包含 startActivity() 绝对是个坏主意。那么,您是否想发送rawValue 对象的集合? DataAnalyse 类甚至是 Activity 吗?您可以编辑问题并澄清。

标签: android firebase firebase-mlkit


【解决方案1】:

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

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")
    }
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 2018-10-13
    • 2010-11-24
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多