当前位置: 首页 > 知识库问答 >
问题:

试图建立一个条码扫描器使用相机和MLKit,但得到MlKitContext尚未初始化异常在BarcodeScanning.get客户端()

阎晗日
2023-03-14

我目前正在尝试使用CameraX和MLKit构建条形码扫描仪,但在调用BarcodeScanning时,我不断遇到“MlKitContext尚未初始化”异常。我的条形码分析器应用程序中的getClient()。我尝试在SO和其他网站上搜索,但我找到的所有其他示例和解决方案要么看起来像我的代码,要么是用Kotlin编写的。我不知道哪里出了问题!仅仅使用相机预览而不进行任何图像分析就可以了,但由于某种原因,上下文似乎没有正确地传输到条形码分析器或其他什么东西。我错过了什么?

以下是错误消息:

E/PreviewUseCase: Binding failed in startCameraPreview: 
    java.lang.IllegalStateException: MlKitContext has not been initialized
        at com.google.android.gms.common.internal.Preconditions.checkState(com.google.android.gms:play-services-basement@@17.4.0:29)
        at com.google.mlkit.common.sdkinternal.MlKitContext.getInstance(com.google.mlkit:common@@17.1.1:2)
        at com.google.mlkit.vision.barcode.BarcodeScanning.getClient(com.google.android.gms:play-services-mlkit-barcode-scanning@@16.1.4:1)
        at com.myscannerapp.ap.barcode.BarcodeAnalyzerX.<init>(BarcodeAnalyzerX.java:29)
        at com.myscannerapp.ap.camera.ScanningCameraX$1.<init>(ScanningCameraX.java:66)
        at com.myscannerapp.ap.camera.ScanningCameraX.lambda$startCameraPreview$0(ScanningCameraX.java:66)
        at com.myscannerapp.ap.camera.-$$Lambda$ScanningCameraX$WAwB0W8s9LNCXGHteEApbFdwKUk.run(Unknown Source:8)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:8167)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)

下面是我的扫描片段、扫描相机类和条形码分析器类的代码。我已经尝试删除不相关的代码,以使其更易于阅读,希望这会有所帮助。哦,“BarcodeCallback”类只是我用来向我的活动发送数据的接口。

下面是我的ScanningFragment的代码:

public class ScanningFragment extends Fragment implements FragmentCommunicationInterface {
    private BarcodeCallback mBarcodeCallback;
    private ScanningCameraX mScanningCameraX;
    private Context mContext;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_barcode_scanner,container,false);

        mScanningCameraX = new ScanningCameraX(mContext,view.findViewById(R.id.rt_scan_camera), mBarcodeCallback);

        return view;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext = context;
        mBarcodeCallback = (BarcodeCallback)getActivity();
    }

    @Override
    public void onResume() {
        super.onResume();
        mScanningCameraX.startCameraPreview();
    }
}

这是我的ScanningCameron aX类的代码:

public class ScanningCameraX {
    private Context mContext;
    private PreviewView mPreviewView;
    private BarcodeCallback mBarcodeCallback;
    private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;

    public ScanningCameraX (Context context, PreviewView previewView, BarcodeCallback barcodeCallback){
        mContext = context;
        mPreviewView = previewView;
        mBarcodeCallback = barcodeCallback;
    }

    public void startCameraPreview() {
        cameraProviderFuture = ProcessCameraProvider.getInstance(mContext);

        final Context CONTEXT = mContext;
        final PreviewView PREVIEW_VIEW = mPreviewView;
        final BarcodeCallback BARCODE_CALLBACK = mBarcodeCallback;

        cameraProviderFuture.addListener(() -> {
            try {
                ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
                Preview preview = new Preview.Builder()
                        .build();

                preview.setSurfaceProvider(PREVIEW_VIEW.getSurfaceProvider());

                ImageAnalysis imageAnalysis =
                        new ImageAnalysis.Builder()
                                .setTargetResolution(new Size(1280, 720))
                                .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
                                .build();


                imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(CONTEXT), new BarcodeAnalyzerX(BARCODE_CALLBACK) {
                    @Override
                    public void analyze(@NonNull ImageProxy image) {
                        int rotationDegrees = image.getImageInfo().getRotationDegrees();
                        // insert future code here.
                    }
                });

                CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build();
                cameraProvider.unbindAll();
                cameraProvider.bindToLifecycle((LifecycleOwner) CONTEXT, cameraSelector, preview, imageAnalysis);
            } catch (Exception e) {
                Log.e("PreviewUseCase", "Binding failed in startCameraPreview: ", e);
            }
        }, ContextCompat.getMainExecutor(mContext));
    }
}

最后,这是我的BarcodeAnalyzerX的代码,在“scanner=BarcodeScanning.getClient();”部分中出错了:

 public class BarcodeAnalyzerX implements ImageAnalysis.Analyzer {
    private BarcodeScanner scanner;
    private BarcodeCallback mBarcodeCallback;

    public BarcodeAnalyzerX(BarcodeCallback barcodeCallback) {
        scanner = BarcodeScanning.getClient();
        mBarcodeCallback = barcodeCallback;
    }

    @Override
    public void analyze(ImageProxy imageProxy) {
        Image mediaImage = imageProxy.getImage();
        final BarcodeCallback BARCODE_CALLBACK = mBarcodeCallback;
        if (mediaImage != null) {
            InputImage image = InputImage.fromMediaImage(mediaImage, imageProxy.getImageInfo().getRotationDegrees());
            Task<List<Barcode>> result = scanner.process(image)
                    .addOnSuccessListener(new OnSuccessListener<List<Barcode>>() {
                        @Override
                        public void onSuccess(List<Barcode> barcodes) {
                            for (Barcode barcode:barcodes){
                                BARCODE_CALLBACK.UpdateBarcode(barcode);
                            }
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(Exception e) {
                            Log.d("BarcodeAnalyzer","Analyzer failed with exception: " + e);
                        }
                    })
                    .addOnCompleteListener(new OnCompleteListener<List<Barcode>>() {
                        @Override
                        public void onComplete(@NonNull Task<List<Barcode>> task) {
                            imageProxy.close();
                        }
                    });
        }
    }
}

共有1个答案

胡高朗
2023-03-14

tRoque a linha mScanningcamaX=new ScanningcamaX(mContext,view.findViewById(R.id.rt_scan_camera), mBarcodeCallback);

PARA mScanningCameraX=new ScanningCameraX(this.getActivity())。getApplicationContext(),视图。findViewById(R.id.rt\u scan\u camera),mBarcodeCallback);

 类似资料:
  • 我使用hbase客户端扫描从远程hbase服务器集群获取数据。当我将筛选器设置为扫描时,客户端将抛出一个异常: ipc:RemoteException:IPC服务器无法读取调用参数:无法初始化org.apache.hadoop.hbase.util.classes。

  • 同一类型的扫描仪方法在一个地方工作,但在另一个地方不工作。。。如果这改变了任何答案,我将使用eclipse作为我的代码编辑器。如果不是在这里,所有变量都已在别处声明。 如果有人知道如何解决这个问题,我将永远感激你:) 这一个正在工作: 这个不起作用: 错误消息:

  • 我经常得到。但这个应用程序运行得很好。注意:我不想将演示者注入到活动中。提前谢谢! 以下是我的活动: 这是我的主持人: 这是我的数据管理器: 和AppDataManager: 最后,我的测试失败了: gradle文件: 我的模块课程: 实际错误是科特林。UninitializedPropertyAccessException:lateinit属性dataManager尚未初始化

  • 我正在使用camerax和google mlkit条形码扫描库来制作一个条形码阅读器。而app扫描qrcode工作良好,但代码格式为条形码,结果会有所不同。条形码有时会扫描多次,例如,有树条形码,但扫描器得到的结果是四个或五个。任何人都知道这个问题,任何帮助都是感激的。图1图2

  • 这是我的主要功能 我在我的主类中调用它,并且一切正常,我可以得到响应。 当我想为它编写测试时,我遇到了错误“kotlin.UninitializedPropertyAccessException:lateinit属性客户端尚未初始化”,有人能帮我吗?"

  • 问题内容: 我收到以下异常。 java.util.NoSuchElementException:找不到行 我在编写一个需要从文本文件读取的较大程序时遇到了此错误,因此决定进行测试。 而且我仍然得到例外。我在与名为stricts.txt的类相同的文件夹中有一个文本文件,其中包含文本。我究竟做错了什么? 问题答案: 新的File(“ restrictions.txt”)将在应用程序的“开始目录”中查找