获取原始条形码数据



我想将 ImageAnalyzer.analyze 中的值作为原始值发布,并将其发送到另一个活动。它变得不像看起来那么简单,因为我不能用返回来覆盖函数。我也无法制作 Toast 或在函数内打开另一个活动,因为我无法在其中沙润上下文。请帮忙。

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

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

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

最新更新