2

我已经在我的 Xamarin.Android 项目中实现了原生 ZXing 嵌入式库,并且一切正常,除了一个问题,当我尝试从一定距离扫描 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()
    {

    }
}
4

0 回答 0