【问题标题】:Migrating qrcode scanner from Mobile vision to ML kit将二维码扫描仪从 Mobile vision 迁移到 ML kit
【发布时间】:2021-11-09 15:58:03
【问题描述】:

我有一个小型测试应用来扫描二维码。它与 Mobile vision 一起使用,但我想迁移到 ML kit。`

工作原理:相机以实时预览开始。 什么不工作:如果我指向一个二维码,它不会触发 task.isSuccessful

如果我取出 if(task.isSuccessful()) 然后在启动相机后立即出现错误 java.lang.IllegalStateException:任务尚未完成 在task.getResult()中

这是我的代码,二维码扫描仪在单独的 Activity 中:

import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.view.PreviewView;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import com.google.mlkit.vision.barcode.Barcode;
import com.google.mlkit.vision.barcode.BarcodeScanner;
import com.google.mlkit.vision.barcode.BarcodeScannerOptions;
import com.google.mlkit.vision.barcode.BarcodeScanning;
import com.google.mlkit.vision.camera.CameraSourceConfig;
import com.google.mlkit.vision.camera.CameraXSource;
import java.util.List;

public class ScanQRcodeActivity extends AppCompatActivity {

    private CameraXSource cameraXSource;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan_q_rcode);
        PreviewView preview = findViewById(R.id.view);
        BarcodeScanner barcodeScanner = BarcodeScanning.getClient(new BarcodeScannerOptions.Builder().setBarcodeFormats(Barcode.FORMAT_QR_CODE).build());
        CameraSourceConfig cameraSourceConfig = new CameraSourceConfig.Builder(this, barcodeScanner, task -> {
            if (task.isSuccessful()){
                final List<Barcode> qrCode = task.getResult();
                if (qrCode.size() != 0) {
                    Intent intent = new Intent();
                    intent.putExtra("QR", qrCode.get(0).getDisplayValue());
                    setResult(Activity.RESULT_OK, intent);
                    cameraXSource.stop();
                    finish();
                }
            }
        }).setFacing(CameraSourceConfig.CAMERA_FACING_BACK).build();
        cameraXSource = new CameraXSource(cameraSourceConfig, preview);
        cameraXSource.start();
    }
}

【问题讨论】:

    标签: java android google-mlkit


    【解决方案1】:

    好的,我忘了第一个任务只是DetectionTaskCallback。这意味着接收到 DetectionTask 的时间。 lambda 隐藏了一点。所以在里面我需要启动一个任务来用barcodescanner处理一张图片。

    所以最后的代码(没有 lambda 给出:):

    
        CameraXSource cameraXSource;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_scan_q_rcode);
            PreviewView preview = findViewById(R.id.view);
            BarcodeScannerOptions barcodeScannerOptions = new BarcodeScannerOptions.Builder().setBarcodeFormats(Barcode.FORMAT_QR_CODE).build();
            BarcodeScanner barcodeScanner = BarcodeScanning.getClient(barcodeScannerOptions);
            CameraSourceConfig cameraSourceConfig = new CameraSourceConfig.Builder(this, barcodeScanner, new DetectionTaskCallback<List<Barcode>>() {
                @Override
                public void onDetectionTaskReceived(@NonNull Task<List<Barcode>> task) {
                    task = barcodeScanner.process(InputImage.fromBitmap(preview.getBitmap(), 0));
                    task.addOnSuccessListener(new OnSuccessListener<List<Barcode>>() {
                        @Override
                        public void onSuccess(@NonNull List<Barcode> barcodes) {
                            if (barcodes.size() != 0) {
                                Intent intent = new Intent();
                                intent.putExtra("QR", barcodes.get(0).getDisplayValue());
                                ScanQRcodeActivity.this.setResult(Activity.RESULT_OK, intent);
                                cameraXSource.stop();
                                ScanQRcodeActivity.this.finish();
                            }
                        }
                    });
                }
            }).setFacing(CameraSourceConfig.CAMERA_FACING_BACK).build();
            cameraXSource = new CameraXSource(cameraSourceConfig, preview);
            cameraXSource.start();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多