Как использовать camera2 с обнаружением штрих-кода

Camera теперь устарела, и рекомендуется использовать camera2, может кто-нибудь подсказать мне, как использовать camera2 с обнаружением штрих-кода

2 ответа

Здесь есть 2 возможности

  1. Создать сканер штрих-кода с нуля (что сложно)
  2. Используйте существующие библиотеки (которые охватывает этот ответ)

Есть несколько хорошо зарекомендовавших себя библиотек, которые вы можете использовать

  • Библиотека ZXing, которая является кроссплатформенной, написана на C++
  • ZXing Embedded - это порт Android
  • Google Mobile Vision API, который проще в использовании

Кроме того, вы можете обратиться к этому вопросу, чтобы получить более полное представление об использовании Camera2 с Mobile Vision.

Да, конечно! Вы должны использовать BarcodeDetector, Что-то вроде этого:

open class BarcodeFragmentInternal : Fragment(), ActivityCompat.OnRequestPermissionsResultCallback {

    protected var mSurfaceView: SurfaceView? = null

    protected var mScanListener: Listener? = null

    private var mCameraSource: CameraSource? = null

    override fun onStart() {
        super.onStart()

        // Initialize Barcode Detector
        // Used to recognize barcodes like {@link Barcode.DATA_MATRIX} and {@link Barcode.QR_CODE}
        val mBarcodeDetector = BarcodeDetector.Builder(activity)
                .setBarcodeFormats(Barcode.DATA_MATRIX or Barcode.QR_CODE)
                .build()
        if (!mBarcodeDetector.isOperational) {
            sendError("NO_BARCODE_DETECTOR")
        }

        mBarcodeDetector.setProcessor(object : Detector.Processor<Barcode> {
            override fun release() {

            }

            override fun receiveDetections(detections: Detector.Detections<Barcode>?) {
                if (detections != null && mScanListener != null) {
                    val detectedItems = detections.detectedItems
                    if (detectedItems != null) {
                        var i = 0
                        val size = detectedItems.size()
                        while (i < size) {
                            val barcode = detectedItems.valueAt(i)
                            mScanListener!!.onQRCodeAvailable(barcode.rawValue)
                            i++
                        }
                    }
                }
            }
        })

        mCameraSource = CameraSource.Builder(context!!, mBarcodeDetector).build()

        mSurfaceView!!.holder.addCallback(object : SurfaceHolder.Callback {
            override fun surfaceCreated(surfaceHolder: SurfaceHolder) {
                try {
                    if (ContextCompat.checkSelfPermission(activity!!, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                        requestCameraPermission()
                        return
                    }
                    mCameraSource!!.start(mSurfaceView!!.holder)
                } catch (e: Exception) {
                    sendError("NO_CAMERA_ACCESS")
                }

            }

            override fun surfaceChanged(surfaceHolder: SurfaceHolder, format: Int, width: Int, height: Int) {

            }

            override fun surfaceDestroyed(surfaceHolder: SurfaceHolder) {
                mCameraSource!!.stop()
            }
        })
    }


    private fun requestCameraPermission() {
        if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) {
            ConfirmationDialog().show(childFragmentManager, FRAGMENT_DIALOG)
        } else {
            requestPermissions(arrayOf(Manifest.permission.CAMERA), REQUEST_CAMERA_PERMISSION)
        }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>,
                                            grantResults: IntArray) {
        if (requestCode == REQUEST_CAMERA_PERMISSION) {
            if (grantResults.size != 1 || grantResults[0] != PackageManager.PERMISSION_GRANTED) {

                sendError("NOT_AUTHORIZED")

                view!!.post {
                    ErrorDialog.newInstance(getString(R.string.request_permission))
                            .show(childFragmentManager, FRAGMENT_DIALOG)
                }
            }
        } else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        }
    }
}
Другие вопросы по тегам