暂停 Zebra TC51 中的条码扫描器

Posted

技术标签:

【中文标题】暂停 Zebra TC51 中的条码扫描器【英文标题】:Suspend barcode scanner in Zebra TC51 【发布时间】:2017-10-17 07:38:35 【问题描述】:

我正在使用 Xamarin Forms 和 Prism 开发应用程序。我正在使用 Zebra SDK 来使用条形码扫描仪硬件。 我使用 MessagingCenter 拦截条形码扫描事件,我在 MainActivity.cs 中有 Send 声明:

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 代码停止和恢复条形码扫描仪。弹出消息是不够的,因为扫描仪是由硬件按钮触发的。

【问题讨论】:

【参考方案1】:

我认为一个简单的解决方案是使用布尔变量“isScannerWorking”。

在您的订阅中检查 isScannerWorking 值

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

         // do something
    


_pageDialogService.DisplayAlertAsync("Barcode Scanner", "My message", "OK"); 之前将“isScannerWorking”设置为 false,在 DisplayAlertAsync 之后设置为 true。这样,您的扫描仪会继续读取条形码,但不会使用它。

否则我认为你必须使用 DependencyService 调用一些 SDK 函数来禁用扫描仪。

【讨论】:

嗨亚历山德罗,我认为作为解决方法的布尔变量是一个很好的解决方案,但扫描的“哔”声仍然存在。我怎样才能使这个声音静音?否则,DependencyService 解决方案可能对我有好处,我将 DependencyService 用于其他功能(例如 ISQLite)。但我不知道如何使用 Zebra SDK 为条码扫描器构建 DependencyService。感谢您的帮助。 我看过techdocs.zebra.com/emdk-for-android/4-2/tutorial/… 似乎有一个scanner.disable。我认为您可以尝试将此属性与dependencyservice一起使用【参考方案2】:

对于初学者,请停止使用消息中心...您可以而且应该改用IEventAggregator。请记住,Container 是您的应用程序的公共属性,因此您实际上可以使用它来解决依赖关系,例如来自平台代码的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

【讨论】:

以上是关于暂停 Zebra TC51 中的条码扫描器的主要内容,如果未能解决你的问题,请参考以下文章

Zebra 设备-TC75x-Android 8.1-条形码扫描问题

通过SN16.dll API为Symbol条码扫描器DS4208捕获图像

Zebra 条形码打印,但不扫描

Zxing 库条码扫描有时会暂停或显示黑屏

Zebra DataWedge 是不是捕获扫描仪上的硬件按键?

ZPL 代码 128 与 mPDF 代码 128 输出不匹配