public class MyBarcodeScannerActivity extends AppCompatActivity {
private PreviewView previewView;
private ExecutorService cameraExecutor;
private Logger logger = LoggerFactory.getLogger(MyBarcodeScannerActivity.class);
private BarcodeScanner barcodeScanner;
private JSONObject options;
private LifecycleCameraController cameraController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.barcode_scanner);
logger.info("create barcode scanner activity");
Intent intent = getIntent();
options = new JSONObject();
if (intent.hasExtra("options") && intent.getStringExtra("options") != null) {
options = JSONObject.parseObject(intent.getStringExtra("options"));
}
previewView = findViewById(R.id.previewView);
// Check for camera permission
if (allPermissionsGranted()) {
// Start the camera when the activity is created and permission granted
startCamera();
} else {
PermissionControler.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, MyBarcodeScanner.REQUEST_CODE);
}
cameraExecutor = Executors.newSingleThreadExecutor();
}
// Start the camera using CameraX
private void startCamera() {
logger.info("scanner start camera");
ArrayList<Integer> formats = new ArrayList<>(
Arrays.asList(Barcode.FORMAT_QR_CODE, Barcode.FORMAT_CODE_39, Barcode.FORMAT_CODE_128,
Barcode.FORMAT_DATA_MATRIX, Barcode.FORMAT_PDF417));
JSONArray userFormats = options.getJSONArray("formats");
if (userFormats != null && !userFormats.isEmpty()) {
formats.clear();
for (int i = 0; i < userFormats.size(); i++) {
Integer item = userFormats.getInteger(i);
if (item != null) formats.add(item);
}
}
cameraController = new LifecycleCameraController(this.getBaseContext());
int[] finalFormats = new int[formats.size()];
for (int i = 1; i < formats.size(); i++) {
finalFormats[i] = formats.get(i);
}
BarcodeScannerOptions scannerOptions = new BarcodeScannerOptions.Builder()
.setBarcodeFormats(formats.get(0) == null ? Barcode.FORMAT_QR_CODE : formats.get(0), finalFormats)
.build();
barcodeScanner = BarcodeScanning.getClient(scannerOptions);
cameraController.setImageAnalysisAnalyzer(cameraExecutor, new MlKitAnalyzer(List.of(barcodeScanner), COORDINATE_SYSTEM_VIEW_REFERENCED, cameraExecutor, (result) -> {
logger.info("Got scanner result {}", result);
if (result == null) return;
List<Barcode> barcodeResults = result.getValue(barcodeScanner);
if (barcodeResults == null ||
barcodeResults.isEmpty() ||
barcodeResults.get(0) == null) {
//no-op
return;
}
Barcode item = barcodeResults.get(0);
Intent intent = new Intent();
intent.putExtra("data", item.getRawValue());
setResult(MyBarcodeScanner.REQUEST_CODE, intent);
finish();
}));
cameraController.bindToLifecycle(this);
previewView.setController(cameraController);
// animateHorizontalLine();
}
@Override
protected void onDestroy() {
super.onDestroy();
logger.info("destroy scanner activity");
// Shutdown the camera executor
cameraExecutor.shutdown();
if (barcodeScanner != null) barcodeScanner.close();
if (cameraController != null) {
cameraController.clearImageAnalysisAnalyzer();
cameraController.unbind();
}
}
private boolean allPermissionsGranted() {
return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MyBarcodeScanner.REQUEST_CODE) {
if (allPermissionsGranted()) {
startCamera();
} else {
finish();
}
}
}
}
I am trying to implmenet a barcode scanner for my Android app, but the scanner only works when I start the activity for the first time, after I finish this activity and start it agian, the consumer of MlKitAnalyzer
never fires.
I also got this error:
SurfaceView - queueBuffer: BufferQueue has been abandoned
I'm not sure what is going wrong