繁体   English   中英

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

[英]Android app crashing when trying to scan barcode

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

这是错误:

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 分钟后发生(所以如果我足够快,我可以扫描条形码),但最终它会出现。

有人可以帮帮我吗? 我在这里缺少什么?

谢谢斯拉维克

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

我永远不应该直接从工作线程更新 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(""); } });

上面显示的错误让我很困惑。 没有什么关于线程。 这就是为什么长期以来我一直在错误的地方寻找解决方案的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM