Xamarin Forms 中的 TC51 Zebra 设备条码扫描问题
TC51 Zebra device barcode scanning problems in Xamarin Forms
我正在使用 Xamarin Forms 和 Prism 为 MVVM 结构开发移动应用程序。
我有一台 TC51 Zebra 设备,我需要拦截条码扫描事件。
SDK 已正确安装在项目中,但在线示例适用于 Xamarin.Android,而不适用于 Xamarin.Forms。
我不知道如何将扫描的条形码从 Android 项目发送到便携式项目 class。
现在我在 MainActivity.cs(Android 项目)中有这个 "Send call":
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 设备的条码扫描器和其他没有集成条码扫描器硬件的设备的相机条码扫描。可能吗?
我认为你可以做这样的事情。
在你的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);
}
}
}
然后,在你的 "ContentPage"
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");
}
我正在使用 Xamarin Forms 和 Prism 为 MVVM 结构开发移动应用程序。 我有一台 TC51 Zebra 设备,我需要拦截条码扫描事件。 SDK 已正确安装在项目中,但在线示例适用于 Xamarin.Android,而不适用于 Xamarin.Forms。 我不知道如何将扫描的条形码从 Android 项目发送到便携式项目 class。
现在我在 MainActivity.cs(Android 项目)中有这个 "Send call":
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 设备的条码扫描器和其他没有集成条码扫描器硬件的设备的相机条码扫描。可能吗?
我认为你可以做这样的事情。
在你的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);
}
}
}
然后,在你的 "ContentPage"
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");
}