在Zebra TC51中挂起条码扫描器
我正在用Xamarin Forms和Prism开发应用程序。我正在使用Zebra SDK来使用条形码扫描仪硬件。 我拦截与MessagingCenter条形码扫描事件,我在MainActivity.cs发送声明:在Zebra TC51中挂起条码扫描器
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代码中停止和恢复条码扫描器。弹出消息是不够的,因为扫描仪是由硬件按钮触发的。
我认为,一个简单的解决方法是使用一个布尔变量“isScannerWorking”。
在你的订阅检查isScannerWorking值
Xamarin.Forms.MessagingCenter.Subscribe<App, string>(this, "Barcode", (sender, arg) =>
{
if(isScannerWorking){
// do something
}
}
集 “isScannerWorking” 假你_pageDialogService.DisplayAlertAsync("Barcode Scanner", "My message", "OK");
前后DisplayAlertAsync后设置为true。这样,您的扫描仪将继续读取条形码,但不会使用它。
否则我认为你必须使用DependencyService来调用一些SDK函数来禁用扫描器。
对于初学者停止使用消息传递中心...您可以而且应该使用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
}
嗨亚历山德罗,我认为布尔变量作为解决方法是一个很好的解决方案,但扫描的“哔哔”声仍然存在。我怎样才能将此声音静音?否则,DependencyService解决方案对我来说可能很好,我对其他功能(例如ISQLite)使用DependencyService。但我不知道如何使用Zebra SDK为条形码扫描器构造DependencyService。感谢您的帮助。 – TeoVr81
我看看http://techdocs.zebra.com/emdk-for-android/4-2/tutorial/tutBasicScanningAPI/似乎有一个scanner.disable。我认为你可以尝试在一个依赖服务中使用这个属性 –