要开始开发Xamarin应用程序,首先需要安装Visual Studio或Xamarin Studio,并确保包含所有必要的Xamarin组件。对于本例,我们将使用Visual Studio。在这链接您可以一步一步地阅读如何下载和安装用于Xamarin应用程序的Visual Studio。
在这一节中,我们将基本解释这个演示项目是如何开发的。如果你需要更详细的解释和更多的对象和方法的信息,请查看这个链接
完成安装后,打开Visual Studio并遵循以下步骤:
1.去文件->新建->项目。
2.创建手机应用程序(Xamarin.Forms)。
3.选择空白应用程序的模板安卓和iOS平台和net标准代码共享策略。
该解决方案包含三个项目:
1.便携式类库(PCL)项目
可移植类库(PCL)是一种特殊类型的项目,可以跨不同的CLI平台(如Xamarin)使用。iOS和Xamarin的。安卓, as well as WPF, Universal Windows Platform, and Xbox. The library can only utilize a subset of the complete .NET framework, limited by the platforms being targeted.
2.Android平台特定应用项目
安卓特定于平台的项目必须引用绑定Xamarin所需的程序集。Android平台SDK,以及Core,共享代码项目。
3.iOS平台特定的应用项目
iOS特定于平台的项目必须引用绑定Xamarin所需的程序集。iOS平台SDK,以及Core,共享代码项目。
在我们的便携式项目中主页这里列出了所有的主要列表,ProductItemPage其中显示了特定列表的所有产品,EditModalPage是一个自定义的弹出窗口来编辑列表/产品名称,MainListItem和ProductListItem模型为列表/产品提供列表项,并且ScannerControl自定义视图控制。
ScannerControl是一个继承自Xamarin.Forms.View控件的类,我们添加了一些额外的自定义属性和事件处理程序。稍后我们将实现自定义渲染器在特定于平台的项目中。
这里我们使用ScannerControl在ProductItemPage添加新项或编辑现有项。
在后面的代码中,首先我们需要初始化、连接和配置scannerControl以便开始扫描过程
与scannerControl.StartScanning ()我们开始扫描过程
在这个项目中,我们将设置所有我们需要的android平台设置(最小android版本,目标android版本,应用程序名称,包名称..),需要我们需要的权限,为android平台添加资源,为android平台创建自定义渲染器,等等。必威随行版官网
首先我们要检查相机根据此应用程序所需的权限。
接下来将在可绘制文件夹中添加必威随行版官网资源(我们在可移植项目中使用的资源)。
现在我们需要参考XamarinDataManLibrary.dll以便使用cmbSDK。
在编写这篇文档的时候,在android平台上有一个Xamarin Forms导航栏图标的bug,这就是为什么在这个项目中我们对Toolbar.axml以及导航页的自定义渲染器(CustomNavigationRenderer).
在这里,我们将为Android平台创建ScannerControl的自定义渲染器(PCL自定义控件)。您不需要编辑这个类。在您的项目中使用相同的方法
[assembly: Xamarin.Forms.ExportRenderer(typeof(ShoppingCart. scannercontrol), typeof(ShoppingCart. droid . scannercontrol))]命名空间ShoppingCart。Droid {public class ScannerControl: ViewRenderer<购物车。ScannerControl, RelativeLayout>, IOnConnectionCompletedListener, IReaderDeviceListener, IOnSymbologyListener { private RelativeLayout rlMainContainer; private ReaderDevice readerDevice; private bool availabilityListenerStarted = false; private static Bitmap svgBitmap; public ScannerControl(Context context) : base(context) { } protected override void OnElementChanged(ElementChangedEventArgs e) { base.OnElementChanged(e); if (e.OldElement != null || Element == null) { return; } rlMainContainer = new RelativeLayout(Context) { LayoutParameters = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MatchParent, RelativeLayout.LayoutParams.MatchParent) }; ...
在这个项目中,我们将为ios平台设置我们需要的所有设置(部署目标,应用程序名称,bundle标识符..),需要我们需要的权限,添加资产,为ios平台创建自定义渲染器,等等…
开放Info.plist文件与一些文本编辑器,并添加以下行:
NSCameraUsageDescription 用于扫描的摄像头。
NSCameraUsageDescription关键是相机许可。
Next将在资产目录中添加新图标,并将创建另一个名为ScannerImages并在目录中添加图标
现在我们需要参考XamarinDataManLibrary.dll以便使用cmbSDK。
ScannerControl类的自定义呈现器ScannerControl (PCL定制控制)在iOS平台。
[assembly: Xamarin.Forms.ExportRenderer(typeof(ShoppingCart. scannercontrol), typeof(ShoppingCart. ios . scannercontrol))]命名空间ShoppingCart。iOS {public class ScannerControl: ViewRenderer, ICMBReaderDeviceDelegate { private UIView container; private CMBReaderDevice readerDevice; private CDMCameraMode cameraMode = CDMCameraMode.NoAimer; private UIAlertController connectingAlert; private NSObject didBecomeActiveObserver; protected override void OnElementChanged(ElementChangedEventArgs e) { base.OnElementChanged(e); if (e.OldElement != null || Element == null) { return; } container = new UIView(); if (Control == null) SetNativeControl(container); ...
如果你打算使用cmbSDK要使用智能手机或平板电脑(没有MX移动终端)进行移动扫描,SDK需要安装许可密钥。没有许可密钥,SDK仍然可以运行,但扫描结果会被模糊化(SDK会用星号字符随机替换扫描结果中的字符)。
请与您的康耐视销售代表联系,了解如何获取许可密钥,包括可用于评估SDK 30天的试用许可。
在获得许可密钥后,有两种方式将许可密钥添加到应用程序中。
为Android平台打开manifest文件并在application标签中添加这个meta标签
或者你可以在创建相机扫描器时直接从代码中注册SDK
/ /创建一个私人空白CreateScannerDevice扫描设备 () { //*************************************************************************************** // 创建一个照相扫描器/ / / /注意:SDK需要许可证密钥。参考/ / SDK文档获得许可证密钥以及方法/ /传递的关键SDK(在这个例子中,我们依靠一个条目在/ / plist.info androidmanifest.xml——也SDK密钥可以通过/ /在这个(GetPhoneCameraDevice)构造函数)作为参数。//*************************************************************************************** scannerControl.GetPhoneCameraDevice (ScannerCameraMode。NoAimer ScannerPreviewOption。违约,假的,“SDK_KEY”);//连接到设备scanercontrol .Connect();}
为iOS平台开放Info.plistfile and add this key
MX_MOBILE_LICENSE 您的许可密钥 . txt
或者你可以在创建相机扫描器时直接从代码中注册SDK
/ /创建一个私人空白CreateScannerDevice扫描设备 () { //*************************************************************************************** // 创建一个照相扫描器/ / / /注意:SDK需要许可证密钥。参考/ / SDK文档获得许可证密钥以及方法/ /传递的关键SDK(在这个例子中,我们依靠一个条目在/ / plist.info androidmanifest.xml——也SDK密钥可以通过/ /在这个(GetPhoneCameraDevice)构造函数)作为参数。//*************************************************************************************** scannerControl.GetPhoneCameraDevice (ScannerCameraMode。NoAimer ScannerPreviewOption。违约,假的,“SDK_KEY”);//连接到设备scanercontrol .Connect();}
这个演示使用cordova插件构建与Cognex移动条码SDK。
Cognex移动条码SDK (cmbSDK)是一个简单而强大的工具,用于开发移动条码扫描应用程序。
基于康耐视的旗舰DataMan技术和康耐视条码扫描SDKcmbSDK为开发人员提供了一个强大的工具,为整个范围的移动扫描设备创建条形码扫描应用程序:从智能手机和平板电脑到高性能的MX线,工业条形码扫描仪。
通过遵循一些简单的指导原则,开发人员可以编写应用程序,在任何受支持的MX移动终端或智能手机上工作,只需要很少或没有条件代码。SDK通过“读取器”连接层抽象设备来实现这一点:一旦应用程序与所需的读取器建立了连接,就会使用一个单一的、统一的API来配置和接口设备。
SDK提供了两个基本的阅读器:一个“MX阅读器”用于使用MX-1000和MX-1502等设备进行条形码扫描,另一个“摄像头阅读器”用于使用移动设备的内置摄像头进行条形码扫描。
这是一个关于如何积分的例子cmbSDK在离子移动应用程序中。
离子用于混合的跨平台移动应用开发,利用HTML和JavaScript呈现用户界面,而电容器让我们能够轻松地创建运行在iOS、Android和web上的现代web应用。
这为开发人员提供了可跨平台执行的可重用代码。它对电容器和PhoneGap /科尔多瓦支持对每个平台的本机访问的插件。本练习的目的是试图展示如何将Cognex移动条码扫描器SDK用于使用Ionic跨平台框架构建的真实应用程序。
您现在可以下载我们的示例应用程序
npm安装
npm安装cmbsdk-cordova
离子电容器添加android
离子电容器运行android
如果我们想使用live reload运行
离子电容器运行android -l -外部
离子电容器添加ios
离子电容器构建ios
一旦构建完成,XCode将被打开。NSCameraUsageDescription 扫描必选
如果你在MX移动终端上使用cmbSDK,你还需要添加支持的外部附属协议或UISupportedExternalAccessoryProtocols来com.cognex.dmcc在你的项目的Info.plist.(在这种情况下,你必须创建一个MFi请求之前发布你的应用程序在苹果应用商店。你可以在让你的MX移动终端启用应用程序进入应用程序商店部分。)
<键> UISupportedExternalAccessoryProtocols < /关键> <字符串> com.cognex.dmcc字符串> < /
7.4通过XCode或CLI命令运行应用程序
离子电容器运行ios
也许第一个参观的地方,是cmbscanner。位于
/ / cmbscanner / cmbscanner.ts project_folder / src /提供者
这是我们配置所有cmbSDK设置的地方。
作为使用cmbSDK的一般规则,我们希望在全局中启用符号或更改输出默认值setConnectionStateDidChangeOfReaderCallback。一旦我们接收到connectionState = connected,我们就可以使用我们想要启用的符号或其他任何我们打算使用的设置来实现魔法。
cmbScanner。setConnectionStateDidChangeOfReaderCallback ((connectionState:数量)= > {this.events.publishConnectionChange (connectionState)如果(connectionState = = cmbScanner.CONSTANTS.CONNECTION_STATE_CONNECTED){/ /图像结果应设置后我们有一个连接到读者cmbScanner.enableImage (this.settings.enableImage);cmbScanner.enableImageGraphics (this.settings.enableImageGraphics);this.settings.enabledSymbols.forEach((v) => {this.所有完成。真正的setSymbologyEnabled (v)。然后((symbResult: any) => {return symbResult;}));});Promise.all (this.allDone)。然后(results =>{//当所有的语句都说了并做了这个时。结束= true;//设置isDone标志}); this.connected = true; cmbScanner.setTriggerType(this.settings.triggerType); } else if (connectionState == cmbScanner.CONSTANTS.CONNECTION_STATE_DISCONNECTED) { this.connected = false; } });
如果您有一个有效的许可密钥,您将希望使用它之前loadScanner()。
cmbScanner.registerSDK(“关键”);//您可以在这里添加您的许可证密钥
或者,你可以直接在manifest文件(android)或ios的plist文件中添加密钥:
或者IOS平台
该应用程序有两种连接模式。摄像头连接器将使用摄像头手机作为扫描仪,MX连接器将使用MX设备作为扫描仪
它还有两种触发模式。您可以扫描代码并获得结果,或者保持连续模式并在扫描项被添加到列表时继续扫描。
本示例还使用了Capacitor存储服务。我们希望我们的设置是持久的,但又不想把事情弄得太复杂,这就是为什么电容存储服务非常适合我们的任务。
使用存储,我们可以保存扫描结果,并在以后重用(或检查)。