C# Xamarin表单中的TC51 Zebra设备条形码扫描问题

C# Xamarin表单中的TC51 Zebra设备条形码扫描问题,c#,xamarin.forms,prism,barcode-scanner,C#,Xamarin.forms,Prism,Barcode Scanner,我正在使用Xamarin表单和Prism for MVVM结构开发一个移动应用程序。 我有一个TC51 Zebra设备,我需要拦截条形码扫描事件。 项目中正确安装了,但在线示例是针对Xamarin.Android的,而不是针对Xamarin.Forms的。 我不知道如何将扫描的条形码从Android project发送到portable project类 现在我在MainActivity.cs(Android项目)中有了这个“发送呼叫”: void scanner\u数据(对象发送器,scann

我正在使用Xamarin表单和Prism for MVVM结构开发一个移动应用程序。 我有一个TC51 Zebra设备,我需要拦截条形码扫描事件。 项目中正确安装了,但在线示例是针对Xamarin.Android的,而不是针对Xamarin.Forms的。 我不知道如何将扫描的条形码从Android project发送到portable project类

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

void scanner\u数据(对象发送器,scanner.DataEventArgs e)
{
ScandaCollection ScandaCollection=e.P0;
if((ScandaCollection!=null)&&(ScandaCollection.Result==ScannerResults.Success))
{
IList Scanda=ScandaCollection.GetScanData();
foreach(ScandaCollection.Scanda中的Scanda数据)
{
Xamarin.Forms.MessagingCenter.Send((Xamarin.Forms.Application)Xamarin.Forms.Application.Current,“条形码”,data.data);
}
}
}
我的ViewModel(Portable project)构造函数中的以下代码:

Xamarin.Forms.MessagingCenter.Subscribe<Xamarin.Forms.Application, string>(Xamarin.Forms.Application.Current, "Barcode", (sender, arg) => { _pageDialogService.DisplayAlertAsync("Test Scan", "Data Received: " + arg, "OK"); });
Xamarin.Forms.MessagingCenter.Subscribe(Xamarin.Forms.Application.Current,“条形码”,“发送方,参数)=>{pageDialogService.DisplayAlertAsync(“测试扫描”,“收到的数据:”+arg,“确定”);});
当我试图读取此页面中的条形码时,应用程序崩溃


我还有另一个问题:既然我在项目中包含了SDK,该应用程序在其他设备上无法运行,它在启动时就会崩溃。我需要有一个单一的应用程序,支持TC51 Zebra设备的条形码扫描仪和其他设备的摄像头条形码扫描,而不需要集成条形码扫描仪硬件。有可能吗?

我想你可以这样做

在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);

        }
    }
}
private App\u my\u应用程序;
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
//……各种各样的事情。。。。
全局::Xamarin.Forms.Forms.Init(这个,savedInstanceState);
_my_应用程序=新应用程序();
加载应用程序(我的应用程序);
}
无效扫描器_数据(对象发送器,scanner.DataEventArgs e)
{
ScandaCollection ScandaCollection=e.P0;
if((ScandaCollection!=null)&&(ScandaCollection.Result==ScannerResults.Success))
{
IList Scanda=ScandaCollection.GetScanData();
foreach(ScandaCollection.Scanda中的Scanda数据)
{
MessagingCenter.Send(我的应用程序“ScanBarcode”,data.data);
}
}
}
然后,在你的“内容页面”

protected override void OnAppearing()
{
base.OnAppearing();
//启用接收条形码
MessagingCenter.Subscribe(此“扫描条形码”(sender,arg)=>{
//在“arg”中有您的条形码
尝试
{
Device.beginInvokeMainThread(()=>
{
显示警报(“条形码读取”,参数,“正常”);
});
}
捕获(例外情况除外){
系统.诊断.调试.写入线(例如消息);
}
});
}
受保护的覆盖无效OnDisappearing()
{
base.OnDisappearing();
//禁用接收条形码
取消订阅(此“扫描条码”);
}

嗨,亚历山德罗,谢谢你的回答。我试过了,但我也遇到了同样的问题,如果我试图扫描页面内部的条形码,应用程序就会崩溃。我无法调试,因为我没有usb电缆。我在发送方(MainActivity)中尝试了一个try-catch,并记录了以下消息:“异常已被调用的目标抛出。”。我尝试在页面(订阅服务器)中使用try-catch登录,但未成功。您没有stacktrace吗?这是stacktrace:at System.Reflection.MonoMethod.Invoke(System.Object obj、System.Reflection.BindingFlags invokeAttr、System.Reflection.Binder、System.Object[]参数、System.Globalization.CultureInfo culture)[0x00056]in:0位于System.Reflection.MethodBase.Invoke(System.Object obj,System.Object[]参数)[0x00000]in:0位于Xamarin.Forms.MessagingCenter+Subscription.InvokeCallback(System.Object sender,System.Object args)[0x00076]我认为您的问题与EMDK无关,但可能与您如何可视化代码有关…尝试使用Device.BeginInvokeOnMainThread,如updated code@Alessandro Caliaro:如果您有一些可用的示例代码,请提供?您是否成功使用xamarin表单创建了扫描仪应用程序?请共享示例代码。几天来,我一直在尝试实现同样的目标,但不确定如何将android链接到PCL或.Net Standard是的,你可以按照Alessandro的回答进行操作。请阅读评论。请提供一个示例或实现此目标的步骤。我尝试了注释和代码,但似乎不起作用。正如@stezma所说,如果你A提供一个简单的示例,对其他尝试同样方法的人非常有用。
    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");

    }