Используя ZXing в Xamarin для Android, как мне остановить непрерывное сканирование сразу после получения результата?

#android #xamarin #zxing #scanning #continuous

#Android #xamarin #zxing #сканирование #непрерывное

Вопрос:

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

Моя проблема в том, что когда я получаю результат сканирования, для загрузки аудиоплеера требуется некоторое время, поэтому он вызывается дважды или более из-за последующих успешных сканирований.

Есть ли способ остановить непрерывное сканирование, как только я получу правильный результат?

Вот код:

             //Start scanning
        scanner.ScanContinuously(opt, HandleScanResult);

    }

    private void HandleScanResult(ZXing.Result result)
    {
        string msg = "";

        if (result != null amp;amp; !string.IsNullOrEmpty(result.Text))
        {

            msg = result.Text;

            var playerActivity = new Intent(myContext, typeof(AudioActivity));

            //-------------------------------------------------------------                   
            // Prerequisite: load all tracks onto "Assets/tracks" folder
            // You can put here qr code - track assignments here below
            // msg: decoded qr code
            // playerActivity.Putextra second parameter is a relative path
            // under "Assets" directory
            //--------------------------------------------------------------

            //Iterate through tracks stored in assets and load their titles into an array
            System.String[] trackArray = Application.Context.Assets.List("tracks");

            bool trackFound = false;
            foreach (string track in trackArray)
            {
                if (track.Equals(msg   ".mp3"))
                {
                    playerActivity.PutExtra("Track", "tracks/"   msg   ".mp3");

                    for (int i = 0; i < PostList.postList.Count; i  )
                    {
                        if (PostList.postList.ElementAt(i).code.Equals(msg))
                            playerActivity.PutExtra("TrackTitle", PostList.postList.ElementAt(i).title);
                    }
                    myContext.StartActivity(playerActivity);

                    trackFound = true;

                }
            }
  

Спасибо!

Комментарии:

1. Вы пробовали scanner.Stop() ?

2. Если я помещаю что-либо подобное в HandleScanResult, то я получаю сообщение об ошибке, подобное этому: Ошибка CS0103 Название «сканер» не существует в текущем контексте

3. Сделайте это переменной-членом класса?

4. По-видимому, сканер не сработал. Cancel (); не работает из-за ошибки … ?

Ответ №1:

Старый вопрос, но я все равно опубликую его для тех, кто все еще ищет эту информацию. Вам нужно, чтобы ваш сканер был переменной класса. Это мой код:

 public MobileBarcodeScanner scanner = new MobileBarcodeScanner();

private void ArrivalsClick(object sender, EventArgs e)
    {
        try
        {
            if (Arrivals.IsEnabled)
            {
                MobileBarcodeScanningOptions optionsCustom = new MobileBarcodeScanningOptions();

                scanner.TopText = "Scan Barcode";

                optionsCustom.DelayBetweenContinuousScans = 3000;
                scanner.ScanContinuously(optionsCustom, ArrivalResult);
            }
        }
        catch (Exception)
        {
            throw;
        }
    }

    private async void ArrivalResult(ZXing.Result result)
    {
        if (result != null amp;amp; result.Text != "")
        {
            // Making a call to a REST API

            if (resp.StatusCode == System.Net.HttpStatusCode.OK)
            {
                int? res = JsonConvert.DeserializeObject<int>(resp.Content);
                if (res == 0)
                {
                    scanner.Cancel(); // <----- Stops scanner (Something went wrong)
                    Device.BeginInvokeOnMainThread(async () =>
                    {
                        await DisplayAlert("..", "..", "ΟΚ");
                    });
                }
                else
                {
                    Plugin.SimpleAudioPlayer.ISimpleAudioPlayer player = Plugin.SimpleAudioPlayer.CrossSimpleAudioPlayer.Current;
                    player.Load("beep.wav");
                    player.Play(); // Scan successful
                }
            }
            else
            {
                scanner.Cancel();
                Device.BeginInvokeOnMainThread(async () =>
                {
                    await DisplayAlert("..", "..", "ΟΚ");
                });
            }
        }
    }