最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

android - MlkitAnalyzer consumer only fires for the first time - Stack Overflow

programmeradmin3浏览0评论
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

发布评论

评论列表(0)

  1. 暂无评论