Получить сырые данные штрих-кода - PullRequest
0 голосов
/ 28 января 2020

Я хочу освободить значения из ImageAnalyzer.analyze как необработанные значения и отправить его в другое действие. Это стало не так просто, как кажется, потому что я не могу переопределить функцию с возвратом. Я также не могу сделать 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() {}
           }
  }

}

Я сделал следующее. Если я пытаюсь сделать тост с этим контекстным приложением, происходит сбой. Попробуйте открыть другое действие, функция 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")}

        }
    }
}

1 Ответ

0 голосов
/ 30 января 2020

Это моя проблема, которая удовлетворяет мои потребности. Как минимум сейчас.

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