Xamarin的独特之处在于,它提供了一种单一的语言——c#、类库和运行时,可以在iOS、Android和Windows Phone这三个移动平台上运行(Windows Phone的原生语言已经是c#),同时还可以编译原生(非解释性)应用程序,这些应用程序的性能甚至足以满足高要求的游戏。
每一个平台都有不同的特性集,它们编写本机应用程序的能力也各不相同——也就是说,这些应用程序可以编译成本机代码,并与底层Java子系统流畅地互操作。例如,有些平台只允许使用HTML和JavaScript构建应用程序,而有些平台则非常低级,只允许使用C/ c++代码。有些平台甚至不使用本机控制工具包。
Xamarin的独特之处在于,它结合了本地平台的所有功能,并添加了许多自己的强大功能,包括:
Xamarin提供两种商业产品:iOS和xamarin, android。它们都是建在莫诺基于已发布的。net ECMA标准的。net框架的开源版本。Mono几乎与。net框架本身一样长,并且可以在几乎所有可以想象到的平台上运行,包括Linux、Unix、FreeBSD和Mac OS X。
在iOS平台上,是Xamarin的提前(AOT编译器编译Xamarin。iOSapplications directly to native ARM assembly code. On Android, Xamarin’s compiler compiles down to中间语言(伊尔),这是当时的情况即时(JIT)在应用程序启动时编译为本机程序集。
在这两种情况下,Xamarin应用程序都利用自动处理诸如内存分配、垃圾收集、底层平台互操作等事情的运行时。
Xamarin的。形式is a framework that allows developers to rapidly create cross platform user interfaces. It provides it's own abstraction for the user interface that will be rendered using native controls on iOS, Android, Windows, or Windows Phone. This means that applications can share a large portion of their user interface code and still retain the native look and feel of the target platform.
Xamarin的。形式allows for rapid prototyping of applications that can evolve over time to complex applications. Because Xamarin.Forms applications are native applications, they don't have the limitations of other toolkits such as browser sandboxing, limited APIs, or poor performance. Applications written using Xamarin.Forms are able to utilize any of the API’s or features of the underlying platform, such as (but not limited to) CoreMotion, PassKit, and StoreKit on iOS; NFC and Google Play Services on Android; and Tiles on Windows. In addition, it's possible to create applications that will have parts of their user interface created with Xamarin.Forms while other parts are created using the native UI toolkit.
Xamarin的。形式applications are architected in the same way as traditional cross-platform applications. The most common approach is to use便携式图书馆或共享项目容纳共享代码,并创建将使用共享代码的特定于平台的应用程序。
有两种技术可以在Xamarin.Forms中创建用户界面。第一种技术是完全用c#源代码创建ui。第二个技巧是使用可扩展应用程序标记语言(XAML),一种用于描述用户界面的声明性标记语言。有关XAML的更多信息,请参见XAML基础知识。
注意:因为限制,你不能使用我们的SDK在Xamarin使用Xamarin热重启功能。如果您在windows机器上开发,则需要与MAC代理配对,以便构建和运行项目。
要开始开发Xamarin应用程序,首先需要安装Visual Studio或Xamarin Studio,并确保包含所有必要的Xamarin组件。在我们的示例中,我们将使用Visual Studio向您展示如何开发Xamarin应用程序和使用我们的SDK。导航到这里链接一步一步地阅读如何下载和安装Visual Studio for Xamarin应用程序。
打开Visual Studio并执行以下步骤:
1.去File ->新建>项目。
2.选择Android应用程序(Xamarin);设置项目名称并从模板中选择空白应用程序
创建空白应用程序后,创建您将使用的所有资源(图标,图像,样式,布局等)。必威随行版官网你可以从我们的样品中复制它们。
接下来右键单击你的项目文件,然后单击属性,进入Android Manifest部分。
设置你的Manifest文件(应用程序名称,应用程序图标,最小和最大android版本),确保为这个应用程序启用Camera权限。
我们将SDK作为nuget包发布在https://www.nuget.org。请安装Cognex。
注意:如果到目前为止您使用的是本地XamarinDataManLibrary.dll,现在您想要更新SDK,请先删除对XamarinDataManLibrary.dll的引用,然后安装nuget包。
若要在没有MX移动终端的移动设备上使用cmbSDK进行条码扫描,需要安装许可密钥。如果许可证密钥丢失,将显示星号而不是扫描结果。
有关如何获取许可密钥(包括30天试用许可)的信息,请与您的康耐视销售代表联系。
获得许可密钥后,有两种方法可以在应用程序中添加许可密钥。
第一个是在创建readerDevice时直接从代码中实现激活:
…如果(param_deviceClass = = DataManDeviceClass.PhoneCamera ) { //*************************************************************************************** // 创建一个相机读者/ / / /注意:如果我们使用内置摄像头扫描/ /手机或平板电脑,然后SDK需要许可证密钥。参考// SDK的文档获取许可证密钥,以及//将密钥传递给SDK的方法(在这个例子中,我们依赖于// AndroidManifest中的一个条目——也有getPhoneCameraDevice方法,它可以作为参数传递)。//*************************************************************************************** readerDevice = readerDevice。GetPhoneCameraDevice(this, param_cameraMode, PreviewOption)。默认值,null, "SDK_KEY");}
第二是在应用程序标签下的AndroidManifest.xml文件中添加以下行:
<应用>…
1.首先根据你的需要构建你的UI,但要考虑以下方面:
我们的示例应用程序(您可以在cmbSDK包中找到)使用全屏预览。要更改样例应用程序以使用分部视图,请添加以下内容使用在最后inside main RelativeLayout inactivity_scanner.xml文件。使用这个布局作为ViewGroup阅读器设备构造函数中的参数(getPhoneCameraDevice),读取设备初始化。
2.设置以下接口,监控读写器的连接状态,接收读码信息:
公共类ScannerActivity: AppCompatActivity, IOnConnectionCompletedListener, ireaderdevicellistener, IOnSymbologyListener, DataManSystem。IOnResponseReceivedListener ActivityCompat。IOnRequestPermissionsResultCallback{…#region ReaderDevice listener implementation //当一个MX-1xxx设备变得可用时(USB线被插入,或MX设备被打开),//或当一个MX-1xxx以前可用已经变得不可用(USB线被拔出,由于不活动或电池耗尽而关闭)公共void OnAvailabilityChanged(ReaderDevice阅读器){if (reader. getavailability () == Availability.Available) {ConnectToReaderDevice();}如果(reader.GetAvailability() == available . unavailable) {AlertDialog。Builder alert = new AlertDialog.Builder(this);alert .SetTitle("设备变得不可用").SetPositiveButton("OK", (sender, e) => {}) .Create() .Show();}} //连接方法已经完成,在这里你可以看到是否有错误建立连接或没有公共void OnConnectionCompleted(ReaderDevice ReaderDevice, Throwable error){//如果我们有有效的连接错误参数将为空,//否则这里是错误,告知我们的问题,我们有连接到阅读器设备如果(error != null){//请求相机权限,如果有必要如果(错误是CameraPermissionException) ActivityCompat.RequestPermissions(((ScannerActivity)this),新字符串[]{Android.Manifest.Permission.Camera}, REQUEST_PERMISSION_CODE);UpdateUIByConnectionState ();}} //当与readerDevice的连接被改变时调用。// readerDevice只在“ConnectionState”状态下可用。连接ed" state public void OnConnectionStateChanged(ReaderDevice reader) { ClearResult(); if (reader.ConnectionState == ConnectionState.Connected) { // We just connected, so now configure the device how we want it ConfigureReaderDevice(); } isScanning = false; UpdateUIByConnectionState(); } // This is called after scanning has completed, either by detecting a barcode, canceling the scan by using the on-screen button or a hardware trigger button, or if the scanning timed-out public void OnReadResultReceived(ReaderDevice readerDevice, ReadResults results) { ClearResult(); if (results.SubResults != null && results.SubResults.Count > 0) { foreach (ReadResult subResult in results.SubResults) { CreateResultItem(subResult); } } else if (results.Count > 0) { CreateResultItem(results.GetResultAt(0)); } isScanning = false; btnScan.Text = "START SCANNING"; resultListAdapter.NotifyDataSetChanged(); } #endregion ..
3.实例化一个ReaderDevice对象。
使用下面的工厂方法初始化MX阅读器的Reader Device对象:
//*************************************************************************************** // 创建一个MX-1xxx读者(注意,没有许可证密钥 ) //*************************************************************************************** readerDevice = ReaderDevice.GetMXDevice(这个);//当MX设备变为可用/不可用时监听if (!availabilityListenerStarted) {readerDevice.StartAvailabilityListening();availabilityListenerStarted = true;}
MX移动终端的可用性会随着设备的打开或关闭、USB连接线的连接或断开而改变。您可以使用以下命令处理这些更改ReaderDeviceListener接口方法:
OnAvailabilityChanged(ReaderDevice)
建议使用MX移动终端扫描条码。但是,cmbSDK也支持使用移动设备的内置摄像头。这包括支持可选的外部瞄准镜或照明,以及自定义直播预览的外观。
若要使用移动设备的内置摄像头扫描条码,请初始化ReaderDevice对象。getPhoneCameraDevice静态方法。初始化时,相机读取器有几个选项。需要配置以下参数:
的上下文参数提供对当前所处活动的引用。
的CameraMode中定义的CameraMode类型CameraMode.java它接受下表中列出的值之一。
这些模式为阅读器提供以下默认设置:
根据所选择的模式,设置额外的照明选项和行为,也列在表中。
价值 | 描述 | 照明 | 直播预览 |
---|---|---|---|
NO_AIMER | 初始化阅读器使用移动设备屏幕上的实时流预览,以便用户可以将条形码定位在相机的视野内进行检测和解码。如果移动设备没有瞄准配件,请使用此模式。 | 照明是可用的,一个按钮来控制它是可见的直播流预览。 | 显示 |
如果将命令发送给阅读器以进行瞄准器控制,则会忽略它们。 | |||
PASSIVE_AIMER | 初始化阅读器使用被动瞄准器。在这种模式下,设备屏幕上没有直播预览,因为瞄准模式是投影的。 | 照明是不可用的,直播预览没有照明按钮。 | 不显示 |
如果命令被发送到阅读器进行照明控制,它们将被忽略,因为在这种模式下,假定移动设备的内置LED正在用于瞄准器。 | |||
FRONT_CAMERA | 初始化阅读器以使用移动设备的前置摄像头(如果可用)。使用此配置时要小心,因为大多数前置摄像头没有自动对焦和照明,并且提供的图像分辨率明显较低。照明在此模式下不可用。 | 使用前置摄像头。 | 显示 |
照明是不可用的,直播预览没有照明按钮。 | |||
如果命令被发送给阅读器用于瞄准或照明控制,它们将被忽略。 |
的PreviewOption参数类型为PreviewOption中定义的PreviewOption.java,用于更改读取器的默认值或覆盖从所选的派生的默认值CameraMode。您可以指定以下选项:
价值 | 描述 |
---|---|
违约 | 接受CameraMode设置的所有默认值。 |
NO_ZOOM_BUTTON | 隐藏直播预览中的缩放按钮,阻止用户调整移动设备摄像头的缩放。 |
NO_ILLUMINATION_BUTTON | 隐藏直播预览中的照明按钮,防止用户切换照明。 |
HARDWARE_TRIGGER | 启用模拟硬件触发器(音量降低按钮),用于在移动设备上启动扫描。这个按钮只有在按下时才开始扫描,它不需要像专用扫描仪的触发器一样保持,并且第二次按下它不会停止扫描过程。 |
停顿了一下 | 如果使用实时流预览,则显示预览startScanning ()方法调用,但是阅读器在用户按下屏幕上的按钮开始扫描过程之前不会开始解码。 |
ALWAYS_SHOW | 强制显示实时流预览,即使选择了瞄准模式(例如CameraMode == PASSIVE_AIMER)。 |
HIGH_RESOLUTION | 使用更高分辨率的设备摄像头,将默认的1280x720分辨率在支持的设备上更改为1920x1080,在不支持的设备上更改为默认分辨率。这有助于扫描小条形码,但增加了解码时间,因为在每帧中有更多的数据需要处理。 |
HIGH_FRAME_RATE | 使用设备的相机在60帧每秒,而不是默认的30帧每秒,以提供更流畅的相机预览。 |
SHOW_CLOSE_BUTTON | 在局部视图中显示关闭按钮。 |
KEEP_PREVIEW_IN_PAUSED_STATE | 在读取或超时后将预览保持在暂停状态。 |
的ViewGroup(可选)参数指定实时流预览的容器。如果参数为左零,则使用全屏预览。
的RegistrationKey(可选)参数用于使用您拥有的许可密钥许可您的SDK
的CustomData(可选)参数用于自定义跟踪
例子
创建一个阅读器,没有瞄准,没有缩放按钮,并使用一个软触发:
readerDevice =阅读器设备。GetPhoneCameraDevice(this, CameraMode.NoAimer, PreviewOption.NoZoomButton | PreviewOption.Paused);
这开始与扫描仪暂停预览和软触发按钮切换扫描。按下软触发按钮后,预期的预览外观是这样的:
图像中的取景器由于具有设置的活动符号而具有活动扫描表面。有关详细信息,请参见使象征学。
在Android 6.0及以上版本中,您需要向用户请求访问移动设备内置摄像头的权限。
如果由于权限问题而无法打开摄像机,则onConnectionCompleted (readerDevice错误)回调包含CameraPermissionException在error参数中。方法检查此异常类型运算符操作员并请求活动内的许可。
如果(error is CameraPermissionException), ActivityCompat.RequestPermissions(((ScannerActivity) this), new string[] {Android.Manifest.Permission.Camera}, REQUEST_PERMISSION_CODE);
您需要实现ActivityCompat。IOnRequestPermissionResultCallback接口来捕获用户权限结果。
中处理用户响应onRequestPermissionsResult(…),您可以使用以下代码重试连接到手机摄像头:
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults){//检查权限请求的结果。如果用户允许,连接readerDevice If (requestCode == REQUEST_PERMISSION_CODE) {If (grantResults.;)长度> 0 && grantResults[0] == permission . grant) {if (readerDevice != null && readerDevice. grant)= ConnectionState. connected) readerDevice.Connect(this);} else {if (activitypat . shouldshowrequestpermissionrationale (((ScannerActivity)this), Android.Manifest.Permission.Camera)) {AlertDialog. AlertDialog。Builder Builder = new AlertDialog.Builder(this) . setmessage("你需要允许访问相机"). setpositivebutton ("OK", (sender, e) => {ActivityCompat. view . view ")requestpermission (this, new string[] {Android.Manifest.Permission.Camera}, REQUEST_PERMISSION_CODE);}) .SetNegativeButton(“取消”,(发送者,e ) => { });AlertDialog dialog = builder.Create();dialog.Show ();} } } }
连接前,请设置IReaderDeviceListener对象来接收事件:
readerDevice.SetReaderDeviceListener(这个);
此外,您可以启用从阅读器发送最后触发的图像和SVG:
readerDevice.EnableImage(真正的);readerDevice.EnableImageGraphics(真正的);
类初始化后调用connect方法ReaderDevice并设置一个侦听器方法来处理来自阅读器的响应。connect方法取IOnConnectionCompletedListener参数:
//确保设备已打开并准备就绪readerDevice.Connect(ScannerActivity.this);
方法调用以下侦听器方法ReaderDevice状态信息:
public void onconnectionstatechange (ReaderDevice阅读器);public void onConnectionCompleted(ReaderDevice reader, Throwable err)
的onConnectionCompleted方法作为connect的参数传递,也会在连接过程完成时调用。如果存在连接错误,则此方法提供Throwable对象。
连接到扫描设备后,您可能需要更改其某些设置。CmbSDK提供了一组高级的、与设备无关的api,用于设置和检索设备的当前配置。
可以使用正确配置的读取器开始扫描条形码StartScanning方法ReaderDevice类:
readerDevice.StartScanning ();
您可以使用以下命令停止扫描:
readerDevice.StopScanning ();
在下列情况之一时停止扫描:
方法中接收一个ReadResults可迭代的结果集合对象ReaderDevice侦听器方法。的onReadResultReceived因为读取器解码了条形码或扫描过程已经完成而调用侦听器方法。
例子
//在扫描完成后调用,或者通过检测条形码,通过使用屏幕上的按钮或硬件触发按钮取消扫描,或者如果扫描超时则调用。如果结果。年代ubResults != null && results.SubResults.Count > 0) { foreach (ReadResult subResult in results.SubResults) { CreateResultItem(subResult); } } else if (results.Count > 0) { CreateResultItem(results.GetResultAt(0)); } isScanning = false; btnScan.Text = "START SCANNING"; resultListAdapter.NotifyDataSetChanged(); }
CmbSDK不启用任何象征学默认情况下,使用移动设备的内置摄像头读取条形码。您必须启用应用程序需要扫描的所有条形码符号,以实现最佳扫描性能。
方法的以下方法可以启用单个符号ReaderDevice类:
SetSymbologyEnabled(最终的Symbology,最终的boolean enable,最终的IOnSymbologyListener listener)datammatrix, true, null);readerDevice.SetSymbologyEnabled(象征。upclean, true, null);
此方法中用于symbology参数的所有符号都可以在ReaderDevice.java。
例子
/*启用QR扫描*/ readerDevice.SetSymbologyEnabled(symbologyenabled)Qr, true, null);
你也可以使用相同的方法来禁用符号:
/ *禁用代码25扫描*/ readerDevice.SetSymbologyEnabled(symbologyenabled)C25, false, null);
您可以实现的方法IOnSymbologiesListener要查看符号更改的结果:
public void onSymbologyEnabled(ReaderDevice reader, Symbology Symbology, Java.Lang.Boolean enabled, Throwable error) {if (error != null){/*不成功,可能当前设备不支持该符号,或者ReaderDevice和MX设备之间的连接有问题*/}else{//成功}}
如果你的阅读器配备了照明灯,你可以控制它们:当扫描开始时,你可以打开或关闭它们。使用Reader Device对象的以下方法:
readerDevice。年代etLightsOn(true, null);
的接口方法IOnLightsListener,这是该方法的第二个参数。
公共类ScannerActivity: AppCompatActivity, ....IOnLightsListener……{…public void onLightsOnCompleted(ReaderDevice reader, Java.Lang.Boolean on, Throwable error) {if (error != null){//不成功}else{//成功}}
如果使用移动设备的内置摄像头作为读取设备,您可以配置缩放级别及其使用方式。有三个缩放级别:
的设置相机。缩放百分比[100-max] [100-max]命令用于配置两个级别缩放百分比的程度。100是不缩放的,MAX(高达1000)在设备的能力范围内进行缩放。第一个参数用于设置1级缩放,第二个参数用于设置2级缩放。
可以查看当前的缩放设置让相机。ZOOM-PERCENT命令,它返回两个值:级别1和级别2缩放。
例子
readerDevice.DataManSystem。SendCommand(“设置相机。变焦% 250 - 500”);
获取/设置相机。变焦0 - 2设置缩放级别或返回实际设置的另一个命令。SET命令的可能值有:
您可以在扫描之前甚至在扫描期间调用此命令,缩放将上升到配置的级别。如果扫描完成,该值将重置为正常行为(0)。
例子
readerDevice.DataManSystem。SendCommand(“设置相机。放大2”);
当使用移动设备的摄像头时,cmbSDK允许您在预览容器内或全屏中查看摄像头预览。这个预览还包含一个可定制的覆盖。cmbSDK相机覆盖层具有缩放、闪烁和关闭扫描仪的按钮,以及指示扫描超时的进度条。
使用cmbSDK v2.0中最初使用的遗留相机覆盖。x和manateworks SDK,在初始化readerDevice之前使用MWOverlay中的这个属性:
MWOverlay。OverlayMode = mwoverlay .OverlayMode . omlegacy;
当使用cmbSDK覆盖时:
如果您的图像具有与cmbSDK使用的名称相同的名称,则cmbSDK和遗留覆盖都允许您更改缩放和闪光按钮上使用的图像。您可以在参考资料/中找到cmbSDK中使用的图像和名称必威随行版官网drawable-mdpi和drawable-hdpi目录。虽然其他分辨率是可选的,但这两个目录必须包含具有正确名称的图像,以便cmbSDK显示正确的图像。
cmbSDK和遗留覆盖都允许您更改检测到条形码时显示的矩形的颜色和宽度。
例子:
MWOverlay。LocationLineColor = Color.Yellow;MWOverlay。LocationLineWidth = 6;
康耐视扫描设备实现数据控制命令(DataMan Control Commands, DMCC),用于配置和控制设备。设备的每个功能都可以使用这种基于文本的语言来控制。API提供了向设备发送DMC命令的方法。设置和查询配置属性命令。DMC命令适用于所有平台和框架。
的附录包括相机读取器的完整DMCC参考。
下面的示例显示了发送到设备的不同DMCC,以便进行更高级的配置。
例子
//将扫描方向改为全向readerDevice.DataManSystem。SendCommand("SET DECODER.1D-SYMBOLORIENTATION 0", ScannerActivity.this);//将实时流预览的扫描超时改为10秒。SendCommand(“设置解码器。MAX-SCAN-TIMEOUT 10", ScannerActivity.this);
方法中调用DMCC查询命令并接收它们的响应IOnResponseReceivedListener.onResponseReceived ()方法。
//获取连接的设备类型readerDevice.DataManSystem。SendCommand(“设备。名称”,这个);public void onresponserreceived (DataManSystem DataManSystem, DmccResponse DmccResponse) {if (Error != null){//日志失败。e("DMCC_ERR", "获取设备。" NAME failed ", dmcresponse . error . message);} else{//成功-使用以下结果字段://int mResponseId = dmccResponse.ResponseId;//String mPayLoad = dmccResponse.PayLoad;//byte[] mBinaryData = dmccResponse.GetBinaryData();} }
CmbSDK包含一个将设备重置为默认设置的方法。对于MX移动终端,默认设置为保存的配置。如果是内置摄像头,则默认设置为附录,其中不启用任何符号。
需要重置设备,添加:
readerDevice.ResetConfig(空);
在使用MX移动终端时,我们可以区分三种状态:
方法监视此异步方法的完成情况IOnResetConfigListener接口,可选参数。
公共类ScannerActivity: AppCompatActivity, ....IOnResetConfigListener……{…public void onResetConfigCompleted(ReaderDevice reader, Throwable error) {if (error != null){//不成功}else{//成功}
当条形码被成功读取时onReadResultReceived方法创建并返回一个ReadResult对象。如果在单个图像或帧上成功读取多个条形码,则多个ReadResult对象返回ReadResult对象。
ReadResult类具有描述读取条形码结果的属性:
当扫描结束而没有成功读取时,aReadResult与IsGoodRead属性设置为false。
属性中填充Image和ImageGraphics属性ReadResult对象,设置相应的EnableImage ()和/或EnableImageGraphics ()的性质ReaderDevice对象。
要访问扫描条形码中的原始字节,可以使用XML属性。字节以Base64字符串的形式存储在“full_string”标签下。
默认情况下,图像和SVG结果是禁用的,这意味着在扫描时ReadResults对应的属性中不包含任何数据。
要启用图像结果,请调用EnableImage ()方法中的ReaderDevice对象:
readerDevice.EnableImage(真正的);
要启用SVG结果,请调用EnableImageGraphics ()方法ReaderDevice对象:
readerDevice.EnableImageGraphics(真正的);
当设备因电池电量不足或人为断线而断线时,可通过onConnectionStateChanged ()方法IReaderDeviceListener接口。
打开Visual Studio并执行以下步骤:
1.去File ->新建>项目。
2.选择iOS应用(Xamarin),设置项目名称并从模板中选择空白应用程序
创建空白应用程序后,创建所有您将使用的资源(图像,故事板,控制器等)。必威随行版官网你可以从我们的样品中复制它们。
接下来打开你的Info.plist文件并根据需要设置一些项目属性(应用程序名称,部署目标,主界面等)。
重要的是要补充相机的许可在Visual Studio中,没有选项可以从这里添加此权限。你需要打开你的Info.plist在一些文本编辑器中添加这些行:
NSCameraUsageDescription 用于扫描的摄像机
如果您使用MX设备作为阅读器设备,请在Info.plist中添加这些协议:
<键> UISupportedExternalAccessoryProtocols < /关键> <数组> <字符串> com.cognex。Dmcc com.demo.data
请在将应用程序上传到app Store之前检查此部分:让你的MX移动终端应用进入App Store
我们将SDK作为nuget包发布在https://www.nuget.org。请安装Cognex。
注意:如果到目前为止您使用的是本地XamarinDataManLibrary.dll,现在您想要更新SDK,请先删除对XamarinDataManLibrary.dll的引用,然后安装nuget包。
如果您计划在iOS低于12.2的设备上使用应用程序,则需要额外的步骤:
注意:这个包只适用于真实的设备。你将无法在iOS版本低于12.2的模拟器上测试你的应用程序。
若要在没有MX移动终端的移动设备上使用cmbSDK进行条码扫描,需要安装许可密钥。如果许可证密钥丢失,将显示星号而不是扫描结果。
有关如何获取许可密钥(包括30天试用许可)的信息,请与您的康耐视销售代表联系。
获得许可密钥后,有两种方法可以在应用程序中添加许可密钥。
第一个是在创建readerDevice时直接从代码中实现激活:
//*************************************************************************************** // 创建一个相机读者(内置摄像头或一个mx - 100) / / / /注意:如果我们是连接到一个mx - 100 (cameraMode = = kCDMCameraModeActiveAimer) / /不需要许可证密钥。但是,如果我们使用手机或平板电脑的内置摄像头//进行扫描,则SDK需要许可密钥。参考// SDK关于获取许可密钥的文档以及//将密钥传递给SDK的方法(在本例中,我们依赖于// plist.info中的条目——也有readerOfDeviceCamera方法,它可以作为参数传递到//)。//*************************************************************************************** DataManDeviceClass。PhoneCamera: readerDevice = CMBReaderDevice。ReaderOfDeviceCameraWithCameraMode(cameraMode, CDMPreviewOption.Defaults, null, "SDK_KEY"); break;
第二种方法是将其作为带有项目特定值的键添加Info.plist文件:
MX_MOBILE_LICENSE 您的许可证密钥
首先根据你的需要构建你的UI:
如果希望将扫描结果显示为文本,请添加UILabel。
设置以下接口,监控读写器的连接状态,接收读码信息:
//---------------------------------------------------------------------------- // 当一个应用被暂停,到扫描装置的连接通过iOS / /自动关闭;因此,当我们恢复(变为活动)时,我们//必须恢复连接(假设我们有一个连接)。这是我们将用来执行此操作的观察者//。//---------------------------------------------------------------------------- 空白AppBecameActive (NSNotification obj){如果(零& & readerDevice readerDevice ! =。可用性== cmbreaderavailability。可用&& readerDevice。ConnectionState!= CMBConnectionState.Connecting && readerDevice.ConnectionState != CMBConnectionState.Connected) { ConnectToReaderDevice(); } } public override void ViewDidLoad() { base.ViewDidLoad(); // Add our observer for when the app becomes active (to reconnect if necessary) NSNotificationCenter.DefaultCenter.AddObserver(UIApplication.DidBecomeActiveNotification, AppBecameActive); } // This is called when a MX-1xxx device has became available (USB cable was plugged, or MX device was turned on), // or when a MX-1xxx that was previously available has become unavailable (USB cable was unplugged, turned off due to inactivity or battery drained) [Export("availabilityDidChangeOfReader:")] public void AvailabilityDidChangeOfReader(CMBReaderDevice reader) { ClearResult(); if (reader.Availability != CMBReaderAvailibility.Available) { ShowAlert(null, "Device became unavailable"); } else { ConnectToReaderDevice(); } } // This is called when a connection with the self.readerDevice has been changed. // The self.readerDevice is usable only in the "CMBConnectionStateConnected" state [Export("connectionStateDidChangeOfReader:")] public void ConnectionStateDidChangeOfReader(CMBReaderDevice reader) { isScanning = false; ClearResult(); if (readerDevice.ConnectionState == CMBConnectionState.Connected) { // We just connected, so now configure the device how we want it ConfigureReaderDevice(); if (connectingAlert != null) { connectingAlert.DismissViewController(true, () => { connectingAlert = null; }); } } else if (readerDevice.ConnectionState == CMBConnectionState.Disconnected && connectingAlert != null) { connectingAlert.DismissViewController(true, () => { connectingAlert = null; }); } UpdateUIByConnectionState(); } // This is called after scanning has completed, either by detecting a barcode, canceling the scan by using the on-screen button or a hardware trigger button, or if the scanning timed-out [Export("didReceiveReadResultFromReader:results:")] public void DidReceiveReadResultFromReader(CMBReaderDevice reader, CMBReadResults readResults) { isScanning = false; btnScan.Selected = false; scanResults.RemoveAllObjects(); if (readResults.SubReadResults != null && readResults.SubReadResults.Length > 0) { scanResults.AddObjects(readResults.SubReadResults); } else if (readResults.ReadResults.Length > 0) { scanResults.Add(readResults.ReadResults[0]); } tableViewSource.SetItems(scanResults); tvResults.ReloadData(); }
实例化CMBReaderDevice对象。
初始化CMBReaderDevice与MX-1000, MX-1100或MX-1502等MX移动终端一起使用很容易:只需使用MX设备方法创建阅读器设备(它不需要参数),并设置适当的委托(通常是self):
readerDevice = CMBReaderDevice.ReaderOfMXDevice();readerDevice。WeakDelegate = this;
MX移动终端的可用性会在设备打开或关闭时发生变化,或者在连接或断开闪电电缆时发生变化。您可以使用以下命令处理这些更改CMBReaderDeviceDelegate方法。
AvailabilityDidChangeOfReader(CMBReaderDevice阅读器)
使用移动设备内置摄像头进行条码扫描可能比使用MX移动终端更复杂。因此,cmbSDK支持多种配置,以提供最大的灵活性,包括支持可选的外部瞄准镜和照明,以及自定义实时流预览外观的能力。MX-100是iPhone的外接设备,我们称之为主动瞄准器。
若要使用MX-100或移动设备内置摄像头扫描条码,请初始化CMBReaderDevice对象。ReaderOfDeviceCameraWithCameraMode静态方法。初始化时,相机读取器有几个选项。需要配置以下参数:
* CDMCameraMode * CDMPreviewOption * UIView
的CameraMode参数的类型为CDMCameraMode,它接受以下值之一:
上述模式为作为代码读取器的移动设备提供以下默认设置:
根据选择的模式,可以设置以下附加选项和行为:
的previewOptions类型参数CDMPreviewOption)用于更改读取器的默认值或覆盖从所选的派生的默认值CameraMode。在传递参数时,可以通过OR-ing来指定多个选项。可用的选项如下:
HighResolution:使用更高分辨率的设备摄像头来帮助扫描小条形码,但解码时间较慢。该选项在支持分辨率的设备上将分辨率设置为1920x1080,在不支持分辨率的设备上将分辨率设置为默认值。默认分辨率为1280x720。
例子:
创建一个没有瞄准器和全屏直播预览的阅读器:
readerDevice = CMBReaderDevice.ReaderOfDeviceCameraWithCameraMode(CDMCameraMode。NoAimer CDMPreviewOption。违约,null);readerDevice。WeakDelegate = this;
创建一个阅读器,没有瞄准器,没有缩放按钮,并使用模拟触发器:
readerDevice = CMBReaderDevice.ReaderOfDeviceCameraWithCameraMode(CDMCameraMode。NoAimer CDMPreviewOption。NoZoomBtn|CDMPreviewOption。HwTrigger,零); readerDevice.WeakDelegate = this;
初始化CMBReaderDevice并设置一个委托来处理来自阅读器的响应。
然后使用ConnectWithCompletion:
//确保设备已打开并准备就绪可用性== cmbreaderavailability。可用&& readerDevice。ConnectionState== CMBConnectionState.Disconnected) { if (readerDevice.DeviceClass == DataManDeviceClass.PhoneCamera && cameraMode == CDMCameraMode.ActiveAimer) { connectingAlert = UIAlertController.Create("Connecting", null, UIAlertControllerStyle.Alert); PresentViewController(connectingAlert, true, null); } readerDevice.ConnectWithCompletion((error) => { if (error != null) { ShowAlert("Failed to connect", null); } }); }
当连接ConnectionStateDidChangeOfReader在委托中调用,您可以在其中检查阅读器设备中的连接状态ConnectionState参数。应该是CMBConnectionState,连接,这意味着您已经成功地连接到CMBReaderDevice,并可以开始使用康耐视移动条码SDK。
MX系列移动终端提供了完善的设备配置和管理功能,包括保存设备上的配置。MX设备是康耐视预先配置的,大多数符号和功能都可以使用。
如果您想要自定义配置,请通过DataMan设置工具或congnex快速设置重新配置。这两个工具都可以轻松地将保存的配置分发到多个设备,以便进行简单的配置管理。
移动应用程序能够配置MX设备,为您提供以下选项:
cmbSDK使用一组默认选项,用于使用移动设备的内置摄像头读取条形码。然而,有两个重要的区别需要记住:
MX-100是一款仅适用于iphone的设备外壳附件,它为内置摄像头提供了额外的功能,比如瞄准功能和更好的照明控制。作为MX设备和内置扫描仪的混合体,MX-100具有瞄准强度,照明强度和瞄准调制存储在设备上的设置,而其余的设置,如符号设置,存储在cmbSDK中。看到MX-100用户指南了解更多信息。
以下是使用MX-100设备时要记住的一些事情:
方法的以下方法可以启用单个符号CMBReaderDevice对象:
readerDevice.SetSymbology (CMBSymbology。DataMatrix, true, null);
此方法中用于symbology参数的所有符号都可以在CMBSymbology枚举。
同样的方法也可以用来关闭符号:
readerDevice.SetSymbology (CMBSymbology。DataMatrix, false, null);
如果您的阅读器设备配备了照明(例如led),您可以使用以下方法控制扫描开始时它们是开还是关CMBReaderDevice对象:
readerDevice。年代etLightsON(true, (error) => { if (error != null) { System.Diagnostics.Debug.WriteLine("// Failed to enable illumination, Possible causes are: reader disconnected, out of battery or cable unplugged, or device doesn't come with illumination lights"); } });
请记住,并非所有由cmbSDK支持的设备和设备模式都允许照明控制。例如,如果在被动瞄准模式下使用内置摄像头,照明是不可用的,因为LED正在用于瞄准。
如果使用内置摄像头作为读取设备,则可以配置缩放级别并定义这些缩放级别的使用方式。
手机摄像头有3种变焦级别,分别是:
您可以使用“SET CAMERA”定义这些变焦级别。ZOOM-PERCENT [100-MAX] [100-MAX]”命令。它配置两个级别缩放的百分比。100是没有变焦的,而MAX(高达1000)将变焦到设备所能达到的极限。第一个参数用于设置1级缩放,第二个参数用于设置2级缩放。
当你想检查当前设置时,你可以用“GET CAMERA”来做。zoom - percent”返回两个值:一级和二级缩放。
例子
readerDevice.DataManSystem。SendCommand(“设置相机。变焦% 250 - 500”);
下面是另一个命令,用于设置要使用的缩放级别或返回实际设置:“GET/SET CAMERA”。变焦0 - 2”。
SET命令的可能值有:
可以在扫描前调用该命令,甚至可以在扫描期间调用该命令,缩放到配置的级别。
扫描完成后,数值复位为正常(0)。
例子
readerDevice.DataManSystem。SendCommand(“设置相机。放大2”);
当使用移动设备的内置摄像头时,cmbSDK允许您在预览容器内或全屏中查看摄像头预览。这个预览还包含一个覆盖,可以自定义。cmbSDK相机覆盖层由缩放、闪光、关闭扫描仪(全屏)按钮、指示扫描超时的进度条和相机预览角上的线条组成。有两种可用的覆盖:遗留和CMB覆盖。
使用cmbSDK v2.0中使用的传统相机覆盖。. x和manateworks SDK,在初始化MWOverlay之前使用这个属性CMBReaderDevice:
MWOverlay.SetOverlayMode ((int) OverlayMode.Legacy);
如果使用CMB叠加,你可以在资源/布局目录中找到布局文件:必威随行版官网
CMBScannerPartialView.xib当扫描器在容器内启动时使用(部分视图)
CMBScannerView.xib扫描器全屏启动时
复制您需要的布局文件,或两个布局,然后根据需要修改它们。更改视图的大小、位置或颜色,删除视图,并添加您自己的视图,如覆盖图像。cmbSDK使用的视图(缩放、闪光、关闭按钮、用于在角上绘制线条的视图和进度条)可由sdk使用标签属性,确保标签属性保持不变,以便cmbSDK能够识别视图并继续正常工作。
CMB和遗留覆盖都允许您更改缩放和闪光按钮上使用的图像。要做到这一点,首先复制assets文件夹MWBScannerImages.xcassets从参考资料目录到您必威随行版官网的项目。在VisualStudio中,您可以查看这个assets文件夹中包含的图像,并将其替换为您自己的图像,同时保持图像名称不变。
CMB和LEGACY覆盖层都允许您更改检测到条形码时显示的矩形的颜色和宽度。下面是一个如何做到这一点的例子:
MWOverlay.SetLocationLineUIColor (UIColor.Yellow);MWOverlay.SetLocationLineWidth (5);
每个康耐视扫描设备都执行数据控制命令(DMCC),这是一种配置和控制设备的方法。实际上,设备的每个功能都可以使用这种基于文本的语言来控制。API提供了向设备发送DMCC命令的方法。设置和查询配置属性命令。
附录A包括与相机读取器一起使用的完整DMCC参考。其他支持设备(例如MX-1000)的DMCC命令包含在该特定设备的文档中。
附录B提供与相应的DMCC设置相关的相机读取器配置设置的默认值。
DMC命令适用于所有平台和框架。
下面的示例显示了发送到设备的不同DMCC命令,以便进行更高级的配置。
例子:
将扫描方向改为全向:
readerDevice.DataManSystem。SendCommand(“设置解码器。1D-SYMBOLORIENTATION 0", (response) => { if (response.Status == CDMResponseStatus.DMCC_STATUS_NO_ERROR) { // Command was executed successfully } else { // Command failed, handle errors here } });
将直播预览的扫描超时更改为10秒:
readerDevice.DataManSystem。SendCommand(“设置解码器。MAX-SCAN-TIMEOUT 10", (response) => {if (response);年代tatus == CDMResponseStatus.DMCC_STATUS_NO_ERROR) { // Command was executed successfully } else { // Command failed, handle errors here } });
获取连接设备的类型:
readerDevice.DataManSystem。SendCommand(“设备。类型",(响应)=>{如果(响应)。年代tatus == CDMResponseStatus.DMCC_STATUS_NO_ERROR) { // Command was executed successfully } else { // Command failed, handle errors here } });
cmbSDK包含一个将设备重置为默认设置的方法。在MX移动终端的情况下,这是默认保存的配置,而在内置摄像头的情况下,这些是在附录B,其中不启用任何符号。这种方法如下:
readerDevice.ResetConfigWithCompletion((error) => {if (error != null){//复位配置失败,可能原因有:读取器断开、电池没电或线缆未插});
有了正确配置的阅读器,您就可以扫描条形码了。方法可以简单地完成此操作StartScanning ()方法CMBReaderDevice对象。接下来发生的是基于类型的CMBReaderDevice以及它是如何配置的。一般来说:
在下列情况之一时停止扫描:
当条形码被成功解码后,您将收到一个CMBReadResults数组中CMBReaderDevice的使用以下内容委托ICMBReaderDeviceDelegate方法:
DidReceiveReadResultFromReader(CMBReaderDevice reader, CMBReadResults readResults)
简单地显示ReadResult扫描条形码后:
DidReceiveReadResultFromReader(CMBReaderDevice阅读器,CMBReadResults readResults) {if (readResults. readResults. readResults.)长度> 0){CMBReadResult readResult = (CMBReadResult)readResults.ReadResults[0];如果(readResult。图像!= null) { ivPreview.Image = readResult.Image; } if (readResult.ReadString != null) { lblCode.Text = readResult.ReadString; } } }
在上面的例子中,ivPreview是一个UIImageView用来显示被扫描的条形码的图像,和lblCode是一个UILabel,用于显示条形码的结果。您也可以使用bool fromreadResult。GoodRead检查扫描是否成功。
当条形码被成功读取时,aCMBReadResult对象创建并返回DidReceiveReadResultFromReader方法。如果在单个图像/帧上成功读取多个条形码,则多个CMBReadResult对象被返回。这就是为什么CMBReadResults类的数组CMBReadResult对象包含所有结果。
的CMBReadResult类具有描述读取条形码结果的属性:
当扫描结束而没有成功读取时,aCMBReadResult与GoodRead属性设置为false。这通常发生在扫描被取消或超时时。
启用镜像和ImageGraphics属性中填充的属性CMBReadResult对象,你必须设置相应的ImageResultEnabled和/或SVGResultEnabled的性质CMBReaderDevice对象。
要查看如何并行使用和显示图像和SVG图形的示例,请参阅SDK包中提供的样例应用程序。
要访问扫描条形码中的原始字节,可以使用XML属性。字节以Base64字符串的形式存储在“full_string”标签下。
默认情况下,图像和SVG结果是禁用的,这意味着在扫描时,CMBReadResults将不包含相应属性中的任何数据。
要启用图像结果,使用以下方法从CMBReaderDevice类中设置ImageResultEnabled属性:
readerDevice。图像ResultEnabled = false;
要启用SVG结果,使用以下方法从CMBReaderDevice类中设置imageResultEnabled属性:
readerDevice。年代VGResultEnabled = false;
可能由于电池电量不足或人为断开线缆导致设备断开。这些病例可以通过ConnectionStateDidChangeOfReader的回调ICMBReaderDeviceDelegate。
从非活动状态返回到应用程序后,阅读器设备保持初始化状态,但未连接。不需要重新初始化SDK,但需要重新连接。
一些iOS版本会在恢复应用程序时发送一个“可用”通知,表明外部配件可用。你可以在ICMBReaderDeviceDelegate方法:void AvailabilityDidChangeOfReader(CMBReaderDevice reader)w当阅读器可用时,您可以连接。
例如:
AvailabilityDidChangeOfReader(CMBReaderDevice阅读器){如果(readerDevice。可用性== cmbreaderavailability。Available) { readerDevice.ConnectWithCompletion((error) => { if (error != null) { // handle connection error } }); } }
有些iOS版本不会在简历上报告可用性变化,所以你需要手动处理这个问题。添加观察者UIApplicationDidBecomeActiveNotification和连接。
例子:
public override void ViewDidLoad() {base.ViewDidLoad();UIApplication NSNotificationCenter.DefaultCenter.AddObserver(。DidBecomeActiveNotification AppBecameActive);}无效AppBecameActive(NSNotification obj){如果(readerDevice != null && readerDevice。可用性== cmbreaderavailability。可用&& readerDevice。ConnectionState!= CMBConnectionState.Connecting && readerDevice.ConnectionState != CMBConnectionState.Connected) { readerDevice.ConnectWithCompletion((error) => { if (error != null) { // handle connection error } }); } }
打开Visual Studio并执行以下步骤:
1.去File ->新建>项目。
2.创建手机应用程序(Xamarin.Forms),设置项目名称,从模板中选择空白并选择安卓和iOS平台。
然后右键单击Android平台特定的项目文件,然后单击属性并进入Android Manifest部分。
设置你的Manifest文件(应用名称,应用图标,最小和最大android版本),确保启用相机的许可。
对于iOS平台的特定项目,我们也应该这么做。打开你的Info.plist文件并根据需要设置一些项目属性(应用名称,部署目标等)。
一定要加上相机的许可。在Visual Studio中,没有选项可以从这里添加此权限。你需要打开你的Info.plist在一些文本编辑器中添加这些行:
NSCameraUsageDescription 用于扫描的摄像机
如果您使用MX设备作为阅读器设备,请在Info.plist中添加这些协议:
<键> UISupportedExternalAccessoryProtocols < /关键> <数组> <字符串> com.cognex。Dmcc com.demo.data
请在将应用程序上传到app Store之前检查此部分:让你的MX移动终端应用进入App Store
我们将SDK作为nuget包发布在https://www.nuget.org。请安装Cognex.cmbSDK.XamarinForms这个解决方案中的Nuget包。在安装包时选择所有三个项目。
注意:如果到目前为止您使用的是本地XamarinDataManLibrary.dll,现在您想要更新SDK,请首先在平台特定项目中删除对XamarinDataManLibrary.dll的引用,然后安装nuget包。此外,如果你在scannercontrol .cs类中没有任何自定义代码,你可以从这三个项目中删除它们,因为这个视图渲染器现在也包含在nuget包中了。
如果您计划在iOS低于12.2的设备上使用应用程序,则需要额外的步骤:
注意:这个包只适用于真实的设备。你将无法在iOS版本低于12.2的模拟器上测试你的应用程序。
若要在没有MX移动终端的移动设备上使用cmbSDK进行条码扫描,需要安装许可密钥。如果许可证密钥丢失,将显示星号而不是扫描结果。
有关如何获取许可密钥(包括30天试用许可)的信息,请与您的康耐视销售代表联系。
如果您获得跨平台许可(两个平台的一个许可),在创建相机扫描仪时直接从代码中实现激活:
如果(param_deviceClass = = ScannerDevice.PhoneCamera ) { //*************************************************************************************** // 创建一个照相扫描器(内置摄像头或一个mx - 100) / / / /注意:如果我们是连接到一个mx - 100 (cameraMode = = ScannerCameraMode.ActiveAimer) / /不需要许可证密钥。但是,如果我们使用手机或平板电脑的内置摄像头//进行扫描,则SDK需要许可密钥。参考// SDK关于获取许可密钥的文档以及//将密钥传递给SDK的方法(在本例中,我们依赖于// plist.info和androidmanifest.xml中的条目——也有DeviceCamera方法,它可以作为参数传递)。//*************************************************************************************** scannerControl。GetPhoneCameraDevice (param_cameraMode ScannerPreviewOption。默认值,true, "SDK_KEY");}
否则,如果你有不同的键(仅针对iOS和Android的键),将这些键添加到AndroidManifest.xml或Info中。plist文件。
对于Android,在应用程序标签下的AndroidManifest.xml文件中添加以下行:
<应用>…
对于iOS,将其添加为项目特定Info中带有值的键。plist文件:
MX_MOBILE_LICENSE 您的许可证密钥
//当MX-1xxx设备变得可用(USB电缆被插入,或MX设备被打开)时,//或当以前可用的MX-1xxx变得不可用(USB电缆被拔出,由于不活动或电池耗尽而关闭)时调用。if (availability == ScannerAvailability.Available) {ConnectToScannerDevice();} else if (availability == ScannerAvailability.Unavailable) {DisplayAlert("设备不可用",null, "OK");}} //连接方法已经完成,在这里你可以看到建立连接时是否有错误// (args:OnConnectionCompleted(object sender, object[] args){//如果我们有有效的连接错误参数将为null, //否则这里是错误,告诉我们关于问题,我们有连接到扫描仪如果((ScannerExceptions)args[0] != ScannerExceptions. noexception){//请求相机权限,如果有必要(仅限android),对于iOS,我们处理来自SDK的权限)if ((ScannerExceptions)args[0] == ScannerExceptions. camerapermissionexception) RequestCameraPermission();else {Debug.WriteLine(args . [1].ToString());UpdateUIByConnectionState (ScannerConnectionStatus.Disconnected);}}} //当与扫描器的连接被改变时调用。//扫描器只能在"Connected"状态下使用public void OnConnectionStateChanged(object sender, ScannerConnectionStatus status) {ClearResult(); if (status == ScannerConnectionStatus.Connected) { // We just connected, so now configure the device how we want it ConfigureScannerDevice(); } isScanning = false; UpdateUIByConnectionState(status); } // This is called after scanning has completed, either by detecting a barcode, canceling the scan by using the on-screen button or a hardware trigger button, or if the scanning timed-out public void OnReadResultReceived(object sender, List results) { ClearResult(); foreach (ScannedResult item in results) scanResults.Add(item); isScanning = false; btnScan.Text = "START SCANNING"; }
创建扫描设备
使用以下工厂方法初始化MX阅读器的扫描仪设备对象:
//*************************************************************************************** // 创建一个MX-1xxx扫描仪(注意,没有许可证密钥 ) //*************************************************************************************** scannerControl.GetMXDevice ();
MX移动终端的可用性会随着设备的打开或关闭、USB连接线的连接或断开而改变。您可以使用以下方法来处理这些更改AvailabilityChanged事件处理程序:
OnAvailabilityChanged(扫描可用性参数)
建议使用MX移动终端扫描条码。但是,cmbSDK也支持使用移动设备的内置摄像头。这包括支持可选的外部瞄准镜或照明,以及自定义直播预览的外观。
若要使用移动设备的内置摄像头扫描条码,请初始化扫描设备对象。scannerControl。GetPhoneCameraDevice方法。初始化时,相机读取器有几个选项。需要配置以下参数:
的ScannerCameraMode参数类型为ScannerCameraMode枚举,它接受下表中列出的值之一。
这些模式为扫描仪提供以下默认设置:
根据所选择的模式,设置额外的照明选项和行为,也列在表中。
价值 | 描述 | 照明 | 直播预览 |
---|---|---|---|
NoAimer | 初始化阅读器使用移动设备屏幕上的实时流预览,以便用户可以将条形码定位在相机的视野内进行检测和解码。如果移动设备没有瞄准配件,请使用此模式。 | 照明是可用的,一个按钮来控制它是可见的直播流预览。 | 显示 |
如果将命令发送给阅读器以进行瞄准器控制,则会忽略它们。 | |||
PassiveAimer | 初始化阅读器使用被动瞄准器。在这种模式下,设备屏幕上没有直播预览,因为瞄准模式是投影的。 | 照明是不可用的,直播预览没有照明按钮。 | 不显示 |
如果命令被发送到阅读器进行照明控制,它们将被忽略,因为在这种模式下,假定移动设备的内置LED正在用于瞄准器。 | |||
ActiveAimer (仅适用于iOS) |
时,将不会显示直播预览StartScanning ()方法默认调用。 | 照明是可用的,如果相机预览的预览选项被启用,照明控制按钮也是可用的。 | 不显示 |
接受照明或瞄准器控制命令。 | |||
FrontCamera | 初始化阅读器以使用移动设备的前置摄像头(如果可用)。使用此配置时要小心,因为大多数前置摄像头没有自动对焦和照明,并且提供的图像分辨率明显较低。照明在此模式下不可用。 | 使用前置摄像头。 | 显示 |
照明是不可用的,直播预览没有照明按钮。 | |||
如果命令被发送给阅读器用于瞄准或照明控制,它们将被忽略。 |
扫描仪PreviewOption参数类型为ScannerPreviewOption枚举,用于更改读取器的默认值或覆盖从所选扫描器派生的默认值CameraMode。您可以指定以下选项:
价值 | 描述 |
---|---|
违约 | 接受CameraMode设置的所有默认值。 |
NoZoomButton | 隐藏直播预览中的缩放按钮,阻止用户调整移动设备摄像头的缩放。 |
NoIlluminationButton | 隐藏直播预览中的照明按钮,防止用户切换照明。 |
HardwareTrigger | 启用模拟硬件触发器(音量降低按钮),用于在移动设备上启动扫描。这个按钮只有在按下时才开始扫描,它不需要像专用扫描仪的触发器一样保持,并且第二次按下它不会停止扫描过程。 |
停顿了一下 | 如果使用实时流预览,则显示预览startScanning ()方法调用,但是阅读器在用户按下屏幕上的按钮开始扫描过程之前不会开始解码。 |
AlwaysShow | 强制显示实时流预览,即使选择了瞄准模式(例如CameraMode == PASSIVE_AIMER)。 |
PessimisticCaching | 使用更高分辨率的设备摄像头,将默认的1280x720分辨率在支持的设备上更改为1920x1080,在不支持的设备上更改为默认分辨率。这有助于扫描小条形码,但增加了解码时间,因为在每帧中有更多的数据需要处理。 |
HighResolution (仅适用于iOS) |
使用更高分辨率的设备摄像头来帮助扫描小条形码,但解码时间较慢。该选项在支持分辨率的设备上将分辨率设置为1920x1080,在不支持分辨率的设备上将分辨率设置为默认值。默认分辨率为1280x720。 |
HighFrameRate | 使用设备的相机在60帧每秒,而不是默认的30帧每秒,以提供更流畅的相机预览。 |
ShowCloseButton | 在局部视图中显示关闭按钮。 |
KeepPreviewInPausedState | 在读取或超时后将预览保持在暂停状态。 |
如果全屏参数设置真正的,则使用全屏预览,否则使用部分屏幕预览。
的RegistrationKey(可选)参数用于使用您拥有的许可密钥许可您的SDK
例子:
创建一个没有瞄准器和全屏直播预览的阅读器:
scannerControl.GetPhoneCameraDevice (ScannerCameraMode。NoAimer ScannerPreviewOption。违约,真实);
创建一个阅读器,没有瞄准器,没有缩放按钮,并使用模拟触发器:
scannerControl.GetPhoneCameraDevice (ScannerCameraMode。NoAimer ScannerPreviewOption。NoZoomButton|ScannerPreviewOption.HardwareTrigger,真正的);
在Android 6.0及以上版本中,您需要向用户请求访问移动设备内置摄像头的权限。
如果由于权限问题而无法打开摄像机,则OnConnectionCompleted(发送者,args)回调包含ScannerException在args参数中。您可以检查此异常类型并请求权限。
公共空间OnConnectionCompleted(对象发送方,object [] args){/ /如果我们有有效的连接错误参数将null, / /否则这是错误,告知我们的问题,我们有同时连接扫描仪,如果((ScannerExceptions) args [0] ! = ScannerExceptions.NoException){/ /要求相机允许在必要时(android, iOS我们处理许可SDK)如果(args (ScannerExceptions) [0] = = ScannerExceptions.CameraPermissionException) RequestCameraPermission ();…
如果相机权限被授予,您可以尝试再次连接扫描器设备:
private async void RequestCameraPermission() {var result = await Permissions.RequestAsync();//检查权限请求的结果。如果用户允许,连接到扫描器If (result == PermissionStatus.Granted) {scannerControl.Connect();} else {if (Permissions.ShouldShowRationale()) {if (await DisplayAlert(null, "您需要允许访问相机","OK", "Cancel")) RequestCameraPermission();}}
连接前,请设置OnAvailabilityChanged,ConnectionStateChanged和ConnectionCompleted事件处理程序。
OnConnectionStateChanged(对象发送方,ScannerConnectionStatus状态)public void OnConnectionCompleted(对象发送方,object[] args)
类初始化后调用connect方法ScannerDevice。
//在扫描器被配置或使用之前,需要建立一个连接。}
我们之前设置的事件处理程序将使用new调用ScannerDevice状态信息。
MX系列移动终端提供了完善的设备配置和管理功能,包括保存设备上的配置。MX设备是康耐视预先配置的,大多数符号和功能都可以使用。
如果您想要自定义配置,请通过DataMan设置工具或congnex快速设置重新配置。这两个工具都可以轻松地将保存的配置分发到多个设备,以便进行简单的配置管理。
移动应用程序能够配置MX设备,为您提供以下选项:
cmbSDK使用一组默认选项,用于使用移动设备的内置摄像头读取条形码。然而,有两个重要的区别需要记住:
MX-100是一款仅适用于iphone的设备外壳附件,它为内置摄像头提供了额外的功能,比如瞄准功能和更好的照明控制。作为MX设备和内置扫描仪的混合体,MX-100具有瞄准强度,照明强度和瞄准调制存储在设备上的设置,而其余的设置,如符号设置,存储在cmbSDK中。看到MX-100用户指南了解更多信息。
以下是使用MX-100设备时要记住的一些事情:
CmbSDK不启用任何象征学默认情况下,使用移动设备的内置摄像头读取条形码。您必须启用应用程序需要扫描的所有条形码符号,以实现最佳扫描性能。
方法的以下方法可以启用单个符号ScannerControl类:
SetSymbologyEnabled(symbologyenabled, bool enable)
此方法中用于symbology参数的所有符号都可以在符号学枚举。
例子
//显式启用我们需要的符号。Datamatrix,真正的);scannerControl.SetSymbologyEnabled(象征。C128,真正的);
你也可以使用相同的方法来禁用符号:
//明确地禁用符号,我们知道我们不需要。Codabar、假);
您可以实现SymbologyEnabled事件处理程序来检查符号更改的结果:
// SymbologyEnabled listener (args: symbologysymbology, bool isEnabled, string error) public void OnSymbologyEnabled(object sender, object[] args) {if ((string)args[2] != null)调试。WriteLine("未能启用/禁用" + args[0].ToString());else Debug.WriteLine(((symbol)args[0]).ToString() + ((bool)args[1] ?" Enabled ": " disabled"));}
如果你的扫描器配备了照明灯,你可以使用这个DMCC来控制它们:
scannerControl。年代endCommand("SET LIGHT.INTERNAL-ENABLE ON");
您可以在扫描预览活动时控制灯光,或者如果您在启动扫描仪之前发送此DMCC,您将设置灯光的初始值。
如果使用移动设备的内置摄像头作为读取设备,您可以配置缩放级别及其使用方式。有三个缩放级别:
的设置相机。缩放百分比[100-max] [100-max]命令用于配置两个级别缩放百分比的程度。100是不缩放的,MAX(高达1000)在设备的能力范围内进行缩放。第一个参数用于设置1级缩放,第二个参数用于设置2级缩放。
可以查看当前的缩放设置让相机。ZOOM-PERCENT命令,它返回两个值:级别1和级别2缩放。
例子
scannerControl。年代endCommand("SET CAMERA.ZOOM-PERCENT 250 500");
获取/设置相机。变焦0 - 2设置缩放级别或返回实际设置的另一个命令。SET命令的可能值有:
您可以在扫描之前甚至在扫描期间调用此命令,缩放将上升到配置的级别。如果扫描完成,该值将重置为正常行为(0)。
例子
scannerControl。年代endCommand("SET CAMERA.ZOOM 2");
当使用移动设备的摄像头时,cmbSDK允许您在预览容器内或全屏中查看摄像头预览。这个预览还包含一个可定制的覆盖。cmbSDK相机覆盖层具有缩放、闪烁和关闭扫描仪的按钮,以及指示扫描超时的进度条。
使用cmbSDK v2.0中最初使用的遗留相机覆盖。x和manateworks SDK,在初始化ScannerDevice之前使用它:
private void CreateScannerDevice() {if (param_deviceClass == ScannerDevice.PhoneCamera) {scannercontrol . setooverlay (ScannerOverlay.LEGACY);scannerControl.GetPhoneCameraDevice (ScannerCameraMode。NoAimer ScannerPreviewOption。违约,真实);}
当使用cmbSDK覆盖时:
如果您的图像具有与cmbSDK使用的名称相同的名称,则cmbSDK和遗留覆盖都允许您更改缩放和闪光按钮上使用的图像。您可以在参考资料/中找到cmbSDK中使用的图像和名称必威随行版官网drawable-mdpi和drawable-hdpiAndroid目录和资源目录必威随行版官网MWBScannerImages.xcassetsiOS。
cmbSDK和遗留覆盖都允许您更改检测到条形码时显示的矩形的颜色和宽度。这些更改需要在ConfigureScannerDevice()方法中完成(在我们与扫描仪设备建立有效连接之后)。
例子:
ConfigureScannerDevice(){扫描控制。System.Drawing.Color SetLegacyOverlayLocationLine(255。黄色,6.0f,真);…
康耐视扫描设备实现数据控制命令(DataMan Control Commands, DMCC),用于配置和控制设备。设备的每个功能都可以使用这种基于文本的语言来控制。API提供了向设备发送DMC命令的方法。设置和查询配置属性命令。DMC命令适用于所有平台和框架。
的附录包括相机读取器的完整DMCC参考。
下面的示例显示了发送到设备的不同DMCC,以便进行更高级的配置。
例子
//将扫描方向改为全向扫描器控制。SendCommand("SET DECODER.1D-SYMBOLORIENTATION 0");//更改实时流预览的扫描超时为10秒。SendCommand(“设置解码器。MAX-SCAN-TIMEOUT 10”);
你也可以设置responserreceived事件处理程序来接收来自send命令的响应:
// ResponseReceived listener后,我们发送DMCC命令(args:字符串负载,字符串错误,字符串DMCC)公共void OnResponseReceived(对象发送者,对象[]args) {if((字符串)args[1] != null)调试。WriteLine("执行DMCC失败");其他调试。WriteLine("响应" + (string)args[0] + ": " + (string)args[0]);}
CmbSDK包含一个将设备重置为默认设置的方法。对于MX移动终端,默认设置为保存的配置。如果是内置摄像头,则默认设置为附录,其中不启用任何符号。
要重置设备,请发送此DMCC:
scannerControl.SendCommand(“CONFIG.DEFAULT”);
在使用MX移动终端时,我们可以区分三种状态:
有了正确配置的阅读器,您就可以扫描条形码了。方法可以简单地完成此操作StartScanning ()方法scannerControl。接下来发生的是基于类型的ScannerDevice以及它是如何配置的。一般来说:
在下列情况之一时停止扫描:
当条形码被成功解码时,您将在ReadResultReceived中收到ScannedResult列表事件:
//在扫描完成后调用,通过检测条形码,通过使用屏幕上的按钮或硬件触发按钮取消扫描,或者如果扫描超时公共void OnReadResultReceived(object sender, List results)
简单地显示ScannedResult扫描条形码后:
public void OnReadResultReceived(object sender, List results) {if (results。Count [0]) {ScannedResult readResult = results[0];lblCode。Text = readResult.ResultCode;} }
可能由于电池电量不足或人为断开线缆导致设备断开。这些病例可以在ConnectionStateChanged事件处理程序。
从非活动状态返回到应用程序后,阅读器设备保持初始化状态,但未连接。不需要重新初始化SDK,但需要重新连接。对于iOS,我们是在ScannerControl渲染器中完成的,而对于Android,需要在页面恢复时手动完成:
//当页面消失时,需要关闭与扫描设备的连接;因此,当我们恢复(再次出现此页面)时,我们//必须恢复连接(假设我们有一个)。//这只用于android。/ /创建我们使用iOS观察者的ScannerControl类在iOS平台特定的项目 //---------------------------------------------------------------------------- 如果设备。RuntimePlatform == Device。安卓&& await Permissions.CheckStatusAsync() == PermissionStatus.Granted) { ConnectToScannerDevice(); }