Android barcode scanner using Google ML-Kit Vision
Top level build.gradle
allprojects {
repositories {
maven { url 'https://jitpack.io' }
// other repositories
}
}Module level build.gradle
dependencies {
implementation "com.github.javaherisaber:MLBarcodeScanner:1.0.0"
}Create your layout
<androidx.constraintlayout.widget.ConstraintLayout android:layout_height="match_parent" android:layout_width="match_parent" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <androidx.camera.view.PreviewView android:id="@+id/previewView_cameraScanning" android:layout_height="0dp" android:layout_width="match_parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> <com.buildtoapp.mlbarcodescanner.GraphicOverlay android:id="@+id/graphic_overlay" android:layout_height="0dp" android:layout_width="0dp" app:layout_constraintBottom_toBottomOf="@id/previewView_cameraScanning" app:layout_constraintLeft_toLeftOf="@id/previewView_cameraScanning" app:layout_constraintRight_toRightOf="@id/previewView_cameraScanning" app:layout_constraintTop_toTopOf="@id/previewView_cameraScanning" /> <ImageView android:layout_height="264dp" android:layout_width="264dp" android:src="@drawable/ic_scan_area" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:ignore="ContentDescription" /> </androidx.constraintlayout.widget.ConstraintLayout>
Make sure to grant android.permission.CAMERA and then use the library
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private lateinit var barcodeScanner: MLBarcodeScanner override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) if (!PermissionUtils.allRuntimePermissionsGranted(this, REQUIRED_RUNTIME_PERMISSIONS)) { PermissionUtils.getRuntimePermissions(this, REQUIRED_RUNTIME_PERMISSIONS) } initBarcodeScanner() } private fun initBarcodeScanner() { barcodeScanner = MLBarcodeScanner( callback = { displayValue, rawValue -> // you can process your barcode here }, focusBoxSize = MetricUtils.dpToPx(264), graphicOverlay = binding.graphicOverlay, previewView = binding.previewViewCameraScanning, lifecycleOwner = this, context = this, drawOverlay = true, // show rectangle around detected barcode drawBanner = true // show detected barcode value on top of it ) } companion object { private val REQUIRED_RUNTIME_PERMISSIONS = arrayOf(Manifest.permission.CAMERA) } }
- 2D formats: QR Code, Aztec, Data Matrix, PDF417
- Linear formats: Codabar, Code 39, Code 93, Code 128, EAN-8, EAN-13, EAN-128, ITF, UPC-A, UPC-E
There are two types of dependency for barcode scanning using ML-Kit vision
(with 3-10 MB increase in apk size)
We added this model to the debug variant so that you don't have to wait for GooglePlay services to download it in your testing
(with no increase in apk size but downloaded from Google Play Services on demand)
We added this model to the release variant for end users to reduce apk size