Встроенная в ZXing библиотека сканирует нерелевантные / неправильные значения штрих-кода в некоторых случаях - PullRequest
0 голосов
/ 09 февраля 2019

Я реализовал встроенную ZXing-встроенную библиотеку в своем проекте Xamarin.Android, и все работает нормально, за исключением одной проблемы: когда я пытаюсь сканировать QR-коды или штрих-коды с некоторого расстояния, он возвращает случайные не относящиеся к делу значения, которые совершенно разныеиз оригинальных.После проверки этого поста я попытался ограничить режимы сканирования, но это не имело никакого значения, и он все еще возвращает неправильные значения.Любая помощь будет очень полезна.

Заранее спасибо!

Обновление 2:

Вот мой код, вы можете проверить его и сообщить мне, если что-то нужноисправить в нем:

public class CustomScannerActivity : Activity, DecoratedBarcodeView.ITorchListener
{
    public const int CUSTOMIZED_REQUEST_CODE = 1;

    private CaptureManager capture;
    private DecoratedBarcodeView barcodeScannerView;
    private ImageButton switchFlashlightButton;
    private ImageButton cameraButton;
    private ViewfinderView viewfinderView;
    TextView txtViewBottomText;
    private bool torchOn;


    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        this.ActionBar.Hide();
        SetContentView(Resource.Layout.activity_custom_scannerview);

        barcodeScannerView = (DecoratedBarcodeView)FindViewById(Resource.Id.zxing_barcode_scanner);
        barcodeScannerView.SetTorchListener(this);

        var greenOverlay = (View)FindViewById(Resource.Id.view1);

        Android.Util.DisplayMetrics displayMetrics = Resources.DisplayMetrics;
        var scanWidth = (int)(displayMetrics.WidthPixels * 0.65);
        barcodeScannerView.BarcodeView.FramingRectSize = new Size(scanWidth, 100);

        greenOverlay.LayoutParameters.Width = scanWidth;
        greenOverlay.LayoutParameters.Height = scanWidth;

        CameraSettings settings = barcodeScannerView.BarcodeView.CameraSettings;

        switchFlashlightButton = (ImageButton)FindViewById(Resource.Id.switch_flashlight);
        cameraButton = (ImageButton)FindViewById(Resource.Id.camera);
        viewfinderView = (ViewfinderView)FindViewById(Resource.Id.zxing_viewfinder_view);
        txtViewBottomText = (TextView)FindViewById(Resource.Id.zxing_status_view);

        txtViewBottomText.Text = AppResources.ScanAutomatically;

        if (MainActivity.camPosition)
        {
            settings.RequestedCameraId = Convert.ToInt32(Android.Hardware.CameraFacing.Front);
            switchFlashlightButton.Visibility = ViewStates.Gone;
            barcodeScannerView.BarcodeView.CameraSettings = settings;
            barcodeScannerView.Resume();
        }
        else
        {
            settings.RequestedCameraId = Convert.ToInt32(Android.Hardware.CameraFacing.Back);
            switchFlashlightButton.Visibility = ViewStates.Visible;
            barcodeScannerView.BarcodeView.CameraSettings = settings;
            barcodeScannerView.Resume();
        }

        switchFlashlightButton.Click += (s, e) =>
        {
            if (!torchOn && !MainActivity.camPosition)
            {
                barcodeScannerView.SetTorchOn();
            }
            else
            {
                barcodeScannerView.SetTorchOff();
            }
            torchOn = !torchOn;
        };

        cameraButton.Click += (s, e) =>
        {
            //CameraSettings settings = barcodeScannerView.BarcodeView.CameraSettings;
            if (barcodeScannerView.BarcodeView.IsPreviewActive)
            {
                barcodeScannerView.Pause();
            }

            //swap the id of the camera to be used
            if (settings.RequestedCameraId == Convert.ToInt32(Android.Hardware.CameraFacing.Front))
            {
                settings.RequestedCameraId = Convert.ToInt32(Android.Hardware.CameraFacing.Back);
                switchFlashlightButton.Visibility = ViewStates.Visible;
                barcodeScannerView.SetTorchOff();
                MainActivity.camPosition = false;
                barcodeScannerView.BarcodeView.CameraSettings = settings;
                barcodeScannerView.Resume();
            }
            else
            {
                settings.RequestedCameraId = Convert.ToInt32(Android.Hardware.CameraFacing.Front);
                switchFlashlightButton.Visibility = ViewStates.Gone;
                barcodeScannerView.SetTorchOff();
                MainActivity.camPosition = true;
                barcodeScannerView.BarcodeView.CameraSettings = settings;
                barcodeScannerView.Resume();
            }
        };

        // if the device does not have flashlight in its camera,
        // then remove the switch flashlight button...
        if (!hasFlash())
        {
            switchFlashlightButton.Visibility = ViewStates.Gone;
        }

        capture = new CaptureManager(this, barcodeScannerView);
        capture.InitializeFromIntent(Intent, savedInstanceState);
        capture.Decode();

    }

    protected override void OnResume()
    {
        base.OnResume();
        if (capture != null)
        {
            capture.OnResume();
        }
    }

    protected override void OnPause()
    {
        base.OnPause();
        if (capture != null)
        {
            capture.OnPause();
        }

    }

    protected override void OnDestroy()
    {
        base.OnDestroy();
        if (capture != null)
        {
            capture.OnDestroy();
        }

    }

    protected override void OnSaveInstanceState(Bundle outState)
    {
        base.OnSaveInstanceState(outState);
        if (capture != null)
        {
            capture.OnSaveInstanceState(outState);
        }

    }

    //public override bool OnKeyDown([GeneratedEnum] Keycode keyCode, KeyEvent e)
    //{
    //    return barcodeScannerView.OnKeyDown(keyCode, e) || base.OnKeyDown(keyCode, e);
    //}

    private bool hasFlash()
    {
        return this.ApplicationContext.PackageManager.HasSystemFeature(Android.Content.PM.PackageManager.FeatureCameraFlash);//"android.hardware.camera.flash"
    }

    public void OnTorchOff()
    {

    }

    public void OnTorchOn()
    {

    }
}
...