Как использовать camera2 с обнаружением штрих-кода
Camera теперь устарела, и рекомендуется использовать camera2, может кто-нибудь подсказать мне, как использовать camera2 с обнаружением штрих-кода
2 ответа
Здесь есть 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)
}
}
}