Skip to content

Instantly share code, notes, and snippets.

@MarcoCiaramella
Last active May 19, 2023 08:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MarcoCiaramella/5dba08426866c439e670dc20fe1f8d9e to your computer and use it in GitHub Desktop.
Save MarcoCiaramella/5dba08426866c439e670dc20fe1f8d9e to your computer and use it in GitHub Desktop.
Barcode scanner using CameraX and MLKit
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