1
0

android: don't keep adding BarcodeScannerView instances to contentFrame when starting camera

When putting app to background with qr scanner active, then moved to foreground again,
SimpleScannerActivity instance is not destroyed, but the local mScannerView was re-initialized
with a new instance (through startCamera()) regardless of pre-existing instance, and added to
the contentFrame. This leaves the previous mScannerView instance in limbo, potentially getting
garbage collected at unpredictable times.
This commit is contained in:
Sander van Grieken
2025-07-22 09:42:15 +02:00
parent 8eb3c43603
commit 3947733d9f

View File

@@ -88,17 +88,19 @@ public class SimpleScannerActivity extends Activity {
}
private void startCamera() {
mScannerView = new BarcodeScannerView(this);
mScannerView.setCropRatio(0.75f); // Set crop ratio to 75% (this defines the square area shown in the scanner view)
// by default only Format.QR_CODE is set
ViewGroup contentFrame = (ViewGroup) findViewById(R.id.content_frame);
contentFrame.addView(mScannerView);
mScannerView.setOnBarcodeListener(result -> {
// Handle the scan result
this.setResultAndClose(result.getText());
// Return false to stop scanning after first result
return false;
});
if (mScannerView == null) {
mScannerView = new BarcodeScannerView(this);
mScannerView.setCropRatio(0.75f); // Set crop ratio to 75% (this defines the square area shown in the scanner view)
// by default only Format.QR_CODE is set
ViewGroup contentFrame = (ViewGroup) findViewById(R.id.content_frame);
contentFrame.addView(mScannerView);
mScannerView.setOnBarcodeListener(result -> {
// Handle the scan result
this.setResultAndClose(result.getText());
// Return false to stop scanning after first result
return false;
});
}
mScannerView.openAsync(); // Start camera on resume
}