Last active
May 19, 2023 08:33
-
-
Save MarcoCiaramella/5dba08426866c439e670dc20fe1f8d9e to your computer and use it in GitHub Desktop.
Barcode scanner using CameraX and MLKit
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import android.media.Image; | |
import android.os.Bundle; | |
import android.util.Size; | |
import androidx.annotation.NonNull; | |
import androidx.annotation.Nullable; | |
import androidx.annotation.OptIn; | |
import androidx.appcompat.app.AppCompatActivity; | |
import androidx.camera.core.Camera; | |
import androidx.camera.core.CameraSelector; | |
import androidx.camera.core.ExperimentalGetImage; | |
import androidx.camera.core.ImageAnalysis; | |
import androidx.camera.core.Preview; | |
import androidx.camera.view.PreviewView; | |
import androidx.camera.lifecycle.ProcessCameraProvider; | |
import androidx.core.content.ContextCompat; | |
import androidx.lifecycle.LifecycleOwner; | |
import com.google.android.gms.tasks.Task; | |
import com.google.common.util.concurrent.ListenableFuture; | |
import com.google.mlkit.vision.barcode.BarcodeScanner; | |
import com.google.mlkit.vision.barcode.BarcodeScanning; | |
import com.google.mlkit.vision.barcode.common.Barcode; | |
import com.google.mlkit.vision.common.InputImage; | |
import java.util.List; | |
import java.util.concurrent.ExecutionException; | |
import java.util.concurrent.Executor; | |
import java.util.concurrent.Executors; | |
public class BarcodeScannerActivity extends AppCompatActivity { | |
private BarcodeScanner scanner = BarcodeScanning.getClient(); | |
private ListenableFuture<ProcessCameraProvider> cameraProviderFuture; | |
private final Executor executor = Executors.newSingleThreadExecutor(); | |
@Override | |
protected void onCreate(@Nullable Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_barcodescanner); | |
cameraProviderFuture = ProcessCameraProvider.getInstance(this); | |
cameraProviderFuture.addListener(() -> { | |
try { | |
ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); | |
bindUseCases(cameraProvider); | |
} catch (ExecutionException | InterruptedException e) { | |
// No errors need to be handled for this Future. | |
// This should never be reached. | |
} | |
}, ContextCompat.getMainExecutor(this)); | |
} | |
@OptIn(markerClass = ExperimentalGetImage.class) | |
private void bindUseCases(@NonNull ProcessCameraProvider cameraProvider) { | |
Preview preview = new Preview.Builder().build(); | |
CameraSelector cameraSelector = new CameraSelector.Builder() | |
.requireLensFacing(CameraSelector.LENS_FACING_BACK) | |
.build(); | |
PreviewView previewView = findViewById(R.id.previewView); | |
//previewView.setImplementationMode(PreviewView.ImplementationMode.COMPATIBLE); | |
preview.setSurfaceProvider(previewView.getSurfaceProvider()); | |
ImageAnalysis imageAnalysis = | |
new ImageAnalysis.Builder() | |
.setTargetResolution(new Size(1280, 720)) | |
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) | |
.build(); | |
imageAnalysis.setAnalyzer(executor, (ImageAnalysis.Analyzer) imageProxy -> { | |
Image mediaImage = imageProxy.getImage(); | |
if (mediaImage != null) { | |
InputImage image = InputImage.fromMediaImage(mediaImage, imageProxy.getImageInfo().getRotationDegrees()); | |
Task<List<Barcode>> result = scanner.process(image) | |
.addOnSuccessListener(barcodes -> { | |
imageProxy.close(); | |
// your code | |
}) | |
.addOnFailureListener(e -> { | |
imageProxy.close(); | |
// your code | |
}); | |
} | |
}); | |
Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, imageAnalysis, preview); | |
camera.getCameraControl().enableTorch(true); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment