Подвесной сканер штрих-кода в Zebra TC51

Я разрабатываю приложение с Xamarin Forms и Prism. Я использую Zebra SDK для использования оборудования сканера штрих-кода. Я перехватываю событие сканирования штрих-кода с помощью MessagingCenter, у меня есть объявление Send в MainActivity.cs:

Xamarin.Forms.MessagingCenter.Send<App, string>(_my_application, "Barcode", data.Data);

и я получаю отсканированные данные в ViewModels с подпиской:

Xamarin.Forms.MessagingCenter.Subscribe<App, string>(this, "Barcode", (sender, arg) =>
                {
...

}

Теперь мне нужно остановить сканер штрих-кода в случае функциональных ошибок. Я обычно показываю всплывающее сообщение:

_pageDialogService.DisplayAlertAsync("Barcode Scanner", "My message", "OK");

и я хочу снова включить сканер после того, как пользователь коснется кнопки «ОК». (Я хочу, чтобы это сообщение блокировалось) Как я могу это сделать? Проблема в том, что мой код сканера штрих-кода находится в MainActivity, и я не знаю, как я могу остановить и возобновить работу сканера штрих-кода из кода ViewModel. Всплывающего сообщения недостаточно, так как сканер запускается аппаратной кнопкой.


person TeoVr81    schedule 17.10.2017    source источник


Ответы (2)


Я думаю, что простым решением является использование логической переменной «isScannerWorking».

В подписке проверьте значение isScannerWorking.

Xamarin.Forms.MessagingCenter.Subscribe<App, string>(this, "Barcode", (sender, arg) =>
                {
    if(isScannerWorking){

         // do something
    }

}

Установите для isScannerWorking значение false перед _pageDialogService.DisplayAlertAsync("Barcode Scanner", "My message", "OK"); и установите значение true после DisplayAlertAsync. Таким образом, ваш сканер продолжает считывать штрих-код, но не использует его.

В противном случае я думаю, что вам нужно использовать DependencyService для вызова некоторой функции SDK, чтобы отключить сканер.

person Alessandro Caliaro    schedule 17.10.2017
comment
Привет, Алессандро, я думаю, что логическая переменная в качестве обходного пути является хорошим решением, но звуковой сигнал сканирования остается. Как я могу отключить этот звук? В противном случае мне может подойти решение DependencyService, я использую DependencyService для других функций (например, ISQLite). Но я не знаю, как структурировать DependencyService для сканера штрих-кода с Zebra SDK. Спасибо за помощь. - person TeoVr81; 17.10.2017
comment
Я взглянул на techdocs.zebra.com/emdk -for-android/4-2/tutorial/ Вроде есть scan.disable . Я думаю, вы можете попробовать использовать это свойство с зависимой службой - person Alessandro Caliaro; 17.10.2017

Для начала прекратите использовать Центр сообщений... вместо этого вы можете и должны использовать IEventAggregator. Помните, что контейнер является общедоступным свойством вашего приложения, поэтому вы можете использовать его для разрешения зависимостей, таких как IEventAggregator из кода платформы, например:

// Remember that you may have an Application class already in scope 
// in the platform and may need to fully qualify the XF Application
var app = (App)Xamarin.Forms.Application.Current;
var eventAggregator = app.Container.Resolve<IEventAggregator>();

Чтобы использовать IEventAggregator, вам нужно будет создать события, которые имеют смысл для вашего приложения. Они могут содержать полезную нагрузку или не содержать ее в зависимости от ваших потребностей.

// An event with no payload
public class FooEventA : PubSubEvent { }

// An event with a string payload
public class FooEventB : PubSubEvent<string> { }

Затем вы можете опубликовать и подписаться следующим образом:

eventAggregator.GetEvent<FooEventB>().Publish("Some Payload");

eventAggregator.GetEvent<FooEventB>().Subscribe(OnFooEventBPublished);

private void OnFooEventBPublished(string payload)
{
   // Do stuff
}
person Dan Siegel    schedule 17.10.2017