android - 获取原始条码数据
问题描述
我想从 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")}
}
}
}
解决方案
这是我的问题,满足我的需求。至少现在。
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")
}
}
}
推荐阅读
- r - 如何在 R 中聚合 glm() 函数的数据
- ios - 使用 Storyboard 创建的自定义 UITableViewCell 不显示标签数据 - Swift
- ruby - 如何创建一个随机计时器,在 ruby 中显示给定持续时间内的输出
- c++ - 所以我试图通过查看 C 中的教程来用 C++ 制作这个游戏,我可以用什么来替换 malloc 函数?
- ruby-on-rails - PG::UndefinedTable:错误:关系“类别”不存在:ALTER TABLE“帖子”
- python - TensorFlow2.1.0 中图形可视化失败
- parameters - MapStruct 最佳实践 - 接口/抽象类中的 @Context 参数或字段?
- python - 我做了一个主菜单,但不知道如何让游戏开始
- python - 网页抓取:selenium.common.exceptions.ElementNotInteractableException:消息:元素不可交互
- android - 如何使用 Kotlin 中的 Room 使用实体中的另一个字段来更新 List 中的数据