[Android应用程序在尝试扫描条形码时崩溃

问题描述 投票:0回答:1

我正在尝试使用我的应用程序扫描条形码,但是每次遇到错误时,我都无法理解。

这里是错误:

2020-01-01 16:24:12.462 10754-10754/pl.komp.myapp I/CameraFramework: handleMessage: 16
2020-01-01 16:24:12.486 10754-10754/pl.komp.myapp I/zygote64: Deoptimizing void java.util.ArrayList.clear() due to loop bounds check elimination
2020-01-01 16:24:12.487 10754-10754/pl.komp.myapp D/AndroidRuntime: Shutting down VM
2020-01-01 16:24:12.487 10754-10754/pl.komp.myapp E/AndroidRuntime: [ERB] CRASH: main in pl.komp.myapp(10754)
2020-01-01 16:24:12.492 10754-10754/pl.komp.myapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: pl.komp.myapp, PID: 10754
    java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
        at java.util.ArrayList.clear(ArrayList.java:569)
        at android.view.ViewGroup.buildOrderedChildList(ViewGroup.java:4254)
        at android.view.View.populateAccessibilityNodeInfoDrawingOrderInParent(View.java:8377)
        at android.view.View.onInitializeAccessibilityNodeInfoInternal(View.java:8323)
        at android.widget.TextView.onInitializeAccessibilityNodeInfoInternal(TextView.java:10667)
        at android.view.View.onInitializeAccessibilityNodeInfo(View.java:7387)
        at android.view.View.createAccessibilityNodeInfoInternal(View.java:7346)
        at android.view.View.createAccessibilityNodeInfo(View.java:7331)
        at android.view.accessibility.AccessibilityRecord.setSource(AccessibilityRecord.java:146)
        at android.view.accessibility.AccessibilityRecord.setSource(AccessibilityRecord.java:119)
        at android.view.View.onInitializeAccessibilityEventInternal(View.java:7283)
        at android.widget.TextView.onInitializeAccessibilityEventInternal(TextView.java:10652)
        at android.view.View.onInitializeAccessibilityEvent(View.java:7271)
        at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:7133)
        at android.view.View.sendAccessibilityEventUnchecked(View.java:7118)
        at android.view.View$SendViewStateChangedAccessibilityEvent.run(View.java:26422)
        at android.os.Handler.handleCallback(Handler.java:869)
        at android.os.Handler.dispatchMessage(Handler.java:101)
        at android.os.Looper.loop(Looper.java:206)
        at android.app.ActivityThread.main(ActivityThread.java:6735)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:845)

这里是活动代码:

public class ActivityReadBarcode extends BaseActivity
{
    private SurfaceView _surfaceView;
    private TextView _textViewValue;
    private TextView _textViewFormat;
    private CameraSource _cameraSource;
    private BarcodeDetector _barcodeDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_barcode_scanner);

        _surfaceView = findViewById(R.id.surfaceBarcode);
        _textViewValue = findViewById(R.id.lblBarcodeValue);
        _textViewFormat = findViewById(R.id.lblBarcodeFormat);

        _barcodeDetector = new BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.ALL_FORMATS).build();
        _cameraSource = new CameraSource.Builder(this, _barcodeDetector).setRequestedPreviewSize(640, 480).setAutoFocusEnabled(true).build();

        _surfaceView.getHolder().addCallback(
                new SurfaceHolder.Callback()
                {
                    @Override
                    public void surfaceCreated(SurfaceHolder surfaceHolder)
                    {
                        try
                        {
                            _cameraSource.start(surfaceHolder);
                        }
                        catch (IOException e)
                        {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2)
                    {

                    }

                    @Override
                    public void surfaceDestroyed(SurfaceHolder surfaceHolder)
                    {
                        if (_cameraSource != null)
                        {
                            _cameraSource.stop();
                            _cameraSource.release();
                            _cameraSource = null;
                        }
                    }
                }
        );
        _barcodeDetector.setProcessor(
                new Detector.Processor<Barcode>()
                {
                    private int verifyRead = 0;

                    @Override
                    public void release()
                    {

                    }

                    @Override
                    public void receiveDetections(Detector.Detections<Barcode> detections)
                    {
                        SparseArray<Barcode> codes = detections.getDetectedItems();
                        if (codes.size() > 0)
                        {
                            String readValue = codes.valueAt(0).displayValue;
                            String lastValue = _textViewValue.getText().toString();
                            if (readValue.equals(lastValue))
                                verifyRead++;

                            _textViewFormat.setText(codes.valueAt(0).format);
                            _textViewValue.setText(readValue);

                            if (verifyRead > 10)
                            {
                                Intent intent = new Intent();
                                intent.putExtra("barcode_value", readValue);
                                setResult(RESULT_OK, intent);

                                finish();
                            }
                        }
                        else
                        {
                            verifyRead = 0;
                            _textViewFormat.setText("");
                            _textViewValue.setText("");
                        }
                    }
                }
        );
    }
}

每次打开活动时都会发生错误。有时它会在2秒后发生,有时会在5分钟后发生(因此,如果我足够快,我可以扫描条形码),但最终它会出现。

有人可以帮我吗?我在这里想念什么?

谢谢Slawek

android camera barcode
1个回答
0
投票

我找到了解决问题的方法,我想我会分享的。

我绝对不应该直接从工作线程更新UI。我应该在TextView字段上使用View.post(Runnable)方法:

_textViewFormat.post(new Runnable() { public void run() { _textViewFormat.setText(codes.valueAt(0).format); } });
_textViewValue.post(new Runnable() { public void run() { _textViewValue.setText(readValue); } });

_textViewFormat.post(new Runnable() { public void run() { _textViewFormat.setText(""); } });
_textViewValue.post(new Runnable() { public void run() { _textViewValue.setText(""); } });

上面显示的错误使我感到困惑。与线程无关。这就是为什么我一直在错误的地方寻找解决方案的原因。

© www.soinside.com 2019 - 2024. All rights reserved.