【问题标题】:TC51 Zebra device barcode scanning problems in Xamarin FormsXamarin Forms 中的 TC51 Zebra 设备条码扫描问题
【发布时间】:2018-01-11 07:25:54
【问题描述】:

我正在使用 Xamarin Forms 和 Prism 为 MVVM 结构开发移动应用程序。 我有一个 TC51 Zebra 设备,我需要拦截条形码扫描事件。 SDK 已正确安装在项目中,但在线示例适用于 Xamarin.Android,而不适用于 Xamarin.Forms。 我不知道如何将扫描的条形码从 Android 项目发送到可移植项目类。

现在我在 MainActivity.cs(Android 项目)中有这个“发送呼叫”:

void scanner_Data(object sender, Scanner.DataEventArgs e)
    {
        ScanDataCollection scanDataCollection = e.P0;

        if ((scanDataCollection != null) && (scanDataCollection.Result == ScannerResults.Success))
        {
            IList <ScanDataCollection.ScanData> scanData = scanDataCollection.GetScanData();

            foreach (ScanDataCollection.ScanData data in scanData)
            {
                Xamarin.Forms.MessagingCenter.Send<Xamarin.Forms.Application, string>((Xamarin.Forms.Application)Xamarin.Forms.Application.Current, "Barcode", data.Data);

            }
        }
    }

我的 ViewModel(便携式项目)构造函数中的这段代码:

Xamarin.Forms.MessagingCenter.Subscribe<Xamarin.Forms.Application, string>(Xamarin.Forms.Application.Current, "Barcode", (sender, arg) => { _pageDialogService.DisplayAlertAsync("Test Scan", "Data Received: " + arg, "OK"); });

当我尝试读取此页面中的条形码时,应用程序崩溃。

我还有另一个问题:现在我将 SDK 包含在项目中,该应用程序在其他设备上无法运行,它在启动时崩溃。我需要一个单一的应用程序,支持 TC51 Zebra 设备的条码扫描器和其他设备的相机条码扫描,而无需集成条码扫描器硬件。有可能吗?

【问题讨论】:

  • 您是否使用 xamarin 表单成功创建了扫描仪应用程序?您能否分享示例代码。我试图在几天内实现同样的目标,但不确定如何将 android 链接到 PCL 或 .Net 标准
  • 是的,您可以按照 Alessandro 回答的说明进行操作。另请阅读 cmets。
  • 您能否提供一个示例或实现此目的的步骤。我尝试使用 cmets 和代码,但似乎无法正常工作。正如@stezma 所说,如果你能提供一个简单的样本,对其他尝试相同的人真的很有帮助。

标签: c# xamarin.forms prism barcode-scanner


【解决方案1】:

我认为你可以这样做。

在您的 MainActivity.cs 中

    private App _my_application;
    protected override void OnCreate (Bundle savedInstanceState)
    {

        // .... various things....

        global::Xamarin.Forms.Forms.Init (this, savedInstanceState);
        _my_application = new App ();

        LoadApplication (my_application);

    }


void scanner_Data(object sender, Scanner.DataEventArgs e)
{
    ScanDataCollection scanDataCollection = e.P0;

    if ((scanDataCollection != null) && (scanDataCollection.Result == ScannerResults.Success))
    {
        IList <ScanDataCollection.ScanData> scanData = scanDataCollection.GetScanData();

        foreach (ScanDataCollection.ScanData data in scanData)
        {
            MessagingCenter.Send<App, string> (my_application, "ScanBarcode", data.Data);

        }
    }
}

然后,在您的“内容页面”中

    protected override void OnAppearing ()
    {
        base.OnAppearing ();

        // Enable receive barcode
        MessagingCenter.Subscribe<App, string> (this, "ScanBarcode", (sender, arg) => {

             // In "arg" there is your barcode
            try
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    DisplayAlert("BARCODE READ", arg, "OK");
                });

            }
            catch(Exception ex){

                System.Diagnostics.Debug.WriteLine(ex.Message);
            }
        });

    }

    protected override void OnDisappearing ()
    {
        base.OnDisappearing ();

        // Disable receive barcode 
        MessagingCenter.Unsubscribe<App, string> (this, "ScanBarcode");

    }

【讨论】:

  • 您好亚历山德罗,感谢您的回答。我试过但我有同样的问题,如果我尝试扫描页面内的条形码,应用程序会崩溃。我无法调试,因为我没有 USB 电缆。我尝试在发件人(MainActivity)中尝试捕获并记录此消息:“调用的目标已引发异常。”。我也尝试在页面(订阅者)中使用 try-catch 登录,但没有成功。
  • 你没有堆栈跟踪吗?
  • 这是 StackTrace:在 System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] 参数, System. Globalization.CultureInfoculture) [0x00056] in :0 at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] 参数) [0x00000] in :0 at Xamarin.MessagingCenter +Subscription.InvokeCallback (System.Object sender, System.Object args) [0x00076]
  • 我认为您的问题与 EMDK 无关,但可能是您如何可视化代码...尝试使用 Device.BeginInvokeOnMainThread,如更新的代码中所示
  • @Alessandro Caliaro:如果你有一些工作示例代码?能否提供一下?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 2017-09-30
相关资源
最近更新 更多