#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("..", "..", "ΟΚ");
});
}
}
}