Xamarin的独特之处在于,它提供了一种单一的语言——c#、类库和运行时,可以在iOS、Android和Windows Phone这三个移动平台上运行(Windows Phone的原生语言已经是c#),同时仍然编译本地(非解释性的)应用程序,即使对要求高的游戏也足够高性能。
这些平台中的每一个都有不同的特性集,而且它们编写本机应用程序的能力也各不相同——也就是说,这些应用程序可以编译成本机代码,并且能够与底层Java子系统流畅地互操作。例如,有些平台只允许用HTML和JavaScript构建应用程序,而有些平台非常低级,只允许C/ c++代码。有些平台甚至不使用本机控制工具包。
Xamarin的独特之处在于,它结合了本地平台的所有功能,并添加了许多强大的功能,包括:
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基础知识.
注意:因为限制你不能在Xamarin中使用Xamarin热重启功能使用我们的SDK。如果你在windows机器上开发,你需要与MAC代理配对,以构建和运行你的项目。
要开始开发Xamarin应用程序,首先需要安装Visual Studio或Xamarin Studio,并确保包含所有必要的Xamarin组件。在我们的示例中,我们将使用Visual Studio向您展示如何开发Xamarin应用程序并使用我们的SDK。导航到这个链接逐步阅读如何下载和安装Xamarin应用程序的Visual Studio。
打开Visual Studio,按照以下步骤操作:
1.去File ->新建->项目。
2.选择Android App (Xamarin),设置项目名称并从模板中选择空白应用程序
在创建一个空白应用程序后,创建你将使用的所有资源(图标、图像、样式、布局等)。必威随行版官网你可以从我们的样品中复制它们。
接下来右键单击项目文件,然后单击属性,然后进入Android Manifest部分。
设置你的Manifest文件(应用程序名称,应用程序图标,最小和最大安卓版本),确保为这个应用程序启用相机权限。
我们将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文件的application标签下添加以下一行:
<应用>…
1.首先根据你的需要构建你的UI,但要考虑以下几个方面:
我们的示例应用程序(你可以在cmbSDK包中找到)使用全屏预览。要更改示例应用程序以使用部分视图,请添加以下内容使用在末端内部主要相对布局activity_scanner.xml文件。使用此布局作为ViewGroup读取设备构造函数中的参数(getPhoneCameraDevice)当阅读器设备初始化时。
2.设置以下接口来监控阅读器的连接状态,并接收有关已读代码的信息:
公共类ScannerActivity: AppCompatActivity, IOnConnectionCompletedListener, IReaderDeviceListener, IOnSymbologyListener, DataManSystem。IOnResponseReceivedListener ActivityCompat。IOnRequestPermissionsResultCallback{…//当MX-1xxx设备变得可用(USB电缆被插入,或MX设备被打开),//或当一个MX-1xxx之前可用已经变得不可用(USB电缆被拔出,由于不活动或电池耗尽而关闭)时调用OnAvailabilityChanged(ReaderDevice reader) {if (reader. getavailability () == available . available) {ConnectToReaderDevice();} else if (reader.GetAvailability() == available . unavailable) {AlertDialog.}生成器警报=新的AlertDialog.Builder(这个);alert .SetTitle("设备不可用").SetPositiveButton("OK", (sender, e) => {}) .Create() .Show();}} //连接方法已经完成,在这里你可以看到是否有一个错误建立连接或没有公共void OnConnectionCompleted(ReaderDevice ReaderDevice, Throwable错误){//如果我们有有效的连接错误参数将为null,//否则这里是错误,通知我们的问题,我们连接到阅读器设备如果(错误!= null){//要求相机权限,如果必要的if(错误是CameraPermissionException) activitycompatat . requestpermissions(((扫描活动)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 reader)
建议使用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 FPS,而不是默认的30 FPS,以提供一个更流畅的相机预览。 |
SHOW_CLOSE_BUTTON | 在局部视图中显示关闭按钮。 |
的ViewGroup(可选)参数指定直播流预览的容器。如果该参数为空零时,使用全屏预览。
的RegistrationKey(可选)参数用于使用您拥有的许可密钥授权您的SDK
的CustomData(可选)参数用于自定义跟踪
例子
创建一个没有瞄准器,没有缩放按钮,并使用软触发器的阅读器:
readerDevice =读写设备。GetPhoneCameraDevice(this, CameraMode.NoAimer, PreviewOption.NoZoomButton | PreviewOption.Paused);
这开始预览扫描仪暂停和软触发按钮切换扫描。按下软触发按钮后,预期的预览外观是这样的:
由于设置了活动符号,图像中的取景器具有活动扫描表面。详情请参见使象征学.
对于Android 6.0及以上版本,您需要向用户请求访问移动设备内置摄像头的权限。
如果由于权限问题而无法打开摄像机,则onConnectionCompleted (readerDevice错误)回调包含CameraPermissionException在error参数中。方法检查此异常类型运算符operator和请求活动中的权限。
if (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 . granting) {if (readerDevice != null && readerDevice. grant)ConnectionState != ConnectionState. connected) readerDevice.Connect(this);} else {if (ActivityCompat.ShouldShowRequestPermissionRationale((ScannerActivity)this), Android.Manifest.Permission.Camera)) {AlertDialog。生成器生成器= new AlertDialog.Builder(this) . setmessage("你需要允许访问相机"). setpositivebutton ("OK", (sender, e) => {ActivityCompat. setmessage("你需要允许访问相机")RequestPermissions(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);
下面的侦听器方法使用newReaderDevice状态信息:
onConnectionStateChanged(ReaderDevice reader);onConnectionCompleted(ReaderDevice reader, Throwable err)
的onConnectionCompleted方法作为connect的参数传递,也会在连接过程完成时调用。如果出现连接错误,此方法将提供Throwable对象。
连接到扫描设备后,您可能需要更改其某些设置。CmbSDK提供了一组高级的、与设备无关的api,用于设置和检索设备的当前配置。
方法,可以使用正确配置的读取器开始扫描条形码StartScanning方法。ReaderDevice类:
readerDevice.StartScanning ();
您可以使用以下命令停止扫描:
readerDevice.StopScanning ();
当满足下列条件之一时,扫描停止:
的ReadResults可迭代结果集合对象中成功解码条形码时,将收到一个ReadResults可迭代结果集合对象ReaderDevice侦听器方法。的onReadResultReceived侦听器方法被调用是因为读取器已解码条形码或扫描过程已完成。
例子
//在扫描完成后调用,通过检测条形码,通过使用屏幕按钮或硬件触发按钮取消扫描,或者如果扫描超时公共void OnReadResultReceived(ReaderDevice ReaderDevice, ReadResults results) {ClearResult();如果结果。年代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类:
public void SetSymbologyEnabled(最终的符号学符号学,最终布尔启用,最终的IOnSymbologyListener监听)readerDevice.SetSymbologyEnabled(符号学。数据矩阵,true, null);readerDevice.SetSymbologyEnabled(象征。UpcEan, true, null);
此方法中用于符号参数的所有符号都可以在ReaderDevice.java.
例子
/*启用二维码扫描*/ readerDevice.SetSymbologyEnabled(符号。Qr, true, null);
你也可以使用相同的方法禁用符号:
/ *禁用Code 25扫描*/ readerDevice.SetSymbologyEnabled(符号。C25, false, null);
可以实现的方法IOnSymbologiesListener检查符号改变的结果:
public void onSymbologyEnabled(ReaderDevice reader, Symbology Symbology, Java.Lang.Boolean enabled, Throwable error) {if (error != null){/*不成功可能是当前设备不支持符号,或者ReaderDevice和MX设备之间的连接有问题*/}否则{// Success}}
如果你的阅读设备配备了照明灯,你可以控制它们:当扫描开始时,你可以打开或关闭它们。使用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命令,该命令返回两个值:一级缩放和二级缩放。
例子
readerDevice.DataManSystem。SendCommand(“设置相机。缩放比例250 500”);
获取/设置相机。变焦0 - 2另一个设置缩放级别或返回实际设置的命令。SET命令的取值包括:
您可以在扫描之前或甚至在扫描期间调用此命令,然后缩放上升到配置的级别。如果扫描完成,该值将重置为正常行为(0)。
例子
readerDevice.DataManSystem。SendCommand(“设置相机。放大2”);
当使用移动设备的摄像头时,cmbSDK允许您在预览容器中或全屏查看摄像头预览。此预览还包含一个可定制的覆盖。cmbSDK相机覆盖功能按钮缩放,闪烁和关闭扫描仪,以及一个进度条指示扫描超时。
使用cmbSDK v2.0中最初使用的遗留摄像头覆盖。在初始化readerDevice之前,使用MWOverlay中的这个属性:
MWOverlay。OverlayMode = mwoverlay . overlaymodeenume . omlegacy;
当使用cmbSDK覆盖时:
cmbSDK和遗留的覆盖都允许您更改缩放和闪光按钮上使用的图像,如果您的图像具有与cmbSDK使用的名称相同的名称。您可以在参考资料/中找到cmbSDK中使用的图像和名称必威随行版官网drawable-mdpi而且drawable-hdpi目录。虽然其他分辨率是可选的,但这两个目录必须包含具有正确名称的图像,以便cmbSDK显示正确的图像。
cmbSDK和遗留的覆盖层都允许您更改检测到条形码时显示的矩形的颜色和宽度。
例子:
MWOverlay。LocationLineColor = Color.Yellow;MWOverlay。LocationLineWidth = 6;
康耐视扫描设备实现DataMan控制命令(DMCC),用于配置和控制设备。设备的每个功能都可以使用这种基于文本的语言进行控制。API提供了一种向设备发送DMC命令的方法。存在用于设置和查询配置属性的命令。DMC命令适用于所有平台和框架。
的附录包括完整的DMCC参考相机阅读器。
下面的例子展示了不同的DMCC发送到设备进行更高级的配置。
例子
//修改扫描方向为全向readerDevice.DataManSystem。SendCommand("SET DECODER.1D-SYMBOLORIENTATION 0", ScannerActivity.this);//修改直播预览的扫描超时时间为10秒readerDevice.DataManSystem。SendCommand(“设置解码器。MAX-SCAN-TIMEOUT 10", scaneractivity .this);
中调用DMCC查询命令并接收它们的响应IOnResponseReceivedListener.onResponseReceived ()方法。
//获取连接的设备类型readerDevice.DataManSystem。SendCommand(“设备。名称”,这个);public void onresponserreceived (DataManSystem DataManSystem, DmccResponse DmccResponse) {if (DmccResponse。Error != null){//日志失败。e("DMCC_ERR", "获取设备。NAME failed ", dmccResponse.Error.Message);} else {// Success -使用以下结果字段://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属性。字节存储为“full_string”标记下的Base64字符串。
默认情况下,图像和SVG结果是禁用的,这意味着在扫描时ReadResults对应的属性中不包含任何数据。
要启用图像结果,请调用EnableImage ()方法。ReaderDevice对象:
readerDevice.EnableImage(真正的);
要启用SVG结果,请调用EnableImageGraphics ()方法ReaderDevice对象:
readerDevice.EnableImageGraphics(真正的);
如果设备由于电池电量不足或手动断开线缆而断开连接,则可以通过onConnectionStateChanged ()方法IReaderDeviceListener接口。
打开Visual Studio,按照以下步骤操作:
1.去File ->新建->项目。
2.选择iOS App (Xamarin),设置项目名称并从模板中选择空白应用程序
在创建一个空白应用程序之后,创建你将使用的所有资源(图像、故事板、控制器等)。必威随行版官网你可以从我们的样品中复制它们。
接下来打开你的Info.plist文件和设置一些项目属性为您的需要(应用程序名称,部署目标,主界面等)。
重要的是要补充相机的许可在Visual Studio中,没有从这里添加此权限的选项。你需要打开你的Info.plist在一些文本编辑器中文件并添加这些行:
NSCameraUsageDescription 用于扫描的摄像头
如果您使用MX设备作为阅读器设备,请在Info.plist中添加以下协议:
UISupportedExternalAccessoryProtocols com.cognex。Dmcc com.demo.data . Dmcc com.demo.data
在将你的应用上传到app Store之前,请检查这个部分:让MX移动终端应用进入应用商店
我们将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 您的license密钥 . key>MX_MOBILE_LICENSE
首先根据你的需求构建你的UI:
如果要以文本形式显示扫描结果,请添加UILabel.
设置以下接口来监控阅读器的连接状态,并接收有关已读代码的信息:
//---------------------------------------------------------------------------- // 当一个应用被暂停,到扫描装置的连接通过iOS / /自动关闭;因此,当我们被恢复(变得活跃)时,我们//必须恢复连接(假设我们曾经有一个)。这是我们将使用的观察器。//---------------------------------------------------------------------------- 空白AppBecameActive (NSNotification obj){如果(零& & readerDevice readerDevice ! =。可用性== cmbreaderavailable。可用&&阅读器设备。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移动终端,如MX-1000, MX-1100,或MX-1502是很容易的:简单地使用MX设备方法创建阅读器设备(不需要参数),并设置适当的委托(通常是self):
readerDevice = CMBReaderDevice.ReaderOfMXDevice();readerDevice。WeakDelegate = this;
MX移动终端的可用性可能会在设备打开或关闭时发生变化,或者在闪电电缆连接或断开时发生变化。您可以使用以下方法处理这些更改CMBReaderDeviceDelegate方法。
AvailabilityDidChangeOfReader(CMBReaderDevice reader)
使用移动设备的内置摄像头进行条形码扫描可能比使用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. readerofdevicecamerawithcameramode)NoAimer CDMPreviewOption。违约,null);readerDevice。WeakDelegate = this;
创建一个没有瞄准器,没有缩放按钮,并使用模拟触发器的阅读器:
readerDevice = CMBReaderDevice.ReaderOfDeviceCameraWithCameraMode(CDMCameraMode. readerofdevicecamerawithcameramode)NoAimer CDMPreviewOption。NoZoomBtn|CDMPreviewOption。HwTrigger,零); readerDevice.WeakDelegate = this;
初始化CMBReaderDevice并设置一个委托来处理来自阅读器的响应。
然后使用ConnectWithCompletion:
//如果(readerDevice.)可用性== cmbreaderavailable。可用&&阅读器设备。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安装工具或Cognex快速安装重新配置。这两种工具都可以轻松地将保存的配置分发到多个设备,以便进行简单的配置管理。
移动应用程序能够配置MX设备,让您选择:
cmbSDK使用一组默认选项用于移动设备的内置摄像头读取条形码。然而,有两个重要的区别需要记住:
MX-100是一款仅适用于iphone的设备外壳附件,为内置摄像头提供了额外的功能,如瞄准功能和更好的照明控制。作为MX设备和内置扫描仪的混合,MX-100具有存储在设备上的瞄准器强度、照明强度和瞄准器调制的设置,而其余的设置,如符号设置,存储在cmbSDK中。看到MX-100用户指南获取更多信息。
以下是使用MX-100设备时要记住的一些事情:
控件的以下方法可以启用单个符号CMBReaderDevice对象:
readerDevice.SetSymbology (CMBSymbology。DataMatrix, true, null);
此方法中用于符号参数的所有符号都可以在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和ManateeWorks SDK之前,从MWOverlay使用此属性CMBReaderDevice:
MWOverlay.SetOverlayMode ((int) OverlayMode.Legacy);
如果使用CMB覆盖,你可以在Resources/layout目录中找到布局文件:必威随行版官网
CMBScannerPartialView.xib当扫描程序在容器内启动时使用(部分视图)
CMBScannerView.xib当扫描仪全屏启动时
复制您需要的布局文件,或两个布局,然后根据需要修改它们。更改视图的大小、位置或颜色,删除视图,并添加自己的视图,如叠加图像。cmbSDK使用的视图(缩放、闪光、关闭按钮、用于在角落上绘制线条的视图和进度条)由sdk使用标签属性,确保标签属性保持不变,以便cmbSDK能够识别视图并继续正确地工作。
CMB和遗留的覆盖层都允许您更改缩放和闪光按钮上使用的图像。要做到这一点,首先复制assets文件夹MWBScannerImages.xcassets从资源目录进入您的必威随行版官网项目。在VisualStudio中,您可以查看这个资产文件夹中包含的图像,并在保持图像名称不变的情况下将它们替换为您自己的图像。
CMB和LEGACY覆盖层都允许您更改检测到条形码时显示的矩形的颜色和宽度。下面是一个如何做到这一点的例子:
MWOverlay.SetLocationLineUIColor (UIColor.Yellow);MWOverlay.SetLocationLineWidth (5);
每个康耐视扫描设备都实现了DataMan控制命令(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",(响应)=> {if(响应。年代tatus == CDMResponseStatus.DMCC_STATUS_NO_ERROR) { // Command was executed successfully } else { // Command failed, handle errors here } });
获取连接设备的类型:
readerDevice.DataManSystem。SendCommand(“设备。TYPE",(响应)=> {if(响应。年代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){//重置配置失败,可能原因:reader断连,电池没电或线缆未插拔}});
有了正确配置的阅读器,就可以扫描条形码了。方法可以简单地实现这一点StartScanning ()方法。CMBReaderDevice对象。接下来会发生什么是基于类型CMBReaderDevice以及它是如何配置的。一般来说:
当满足下列条件之一时,扫描停止:
当条形码被成功解码时,您将收到一个CMBReadResults数组的CMBReaderDevice的使用以下方法进行委托ICMBReaderDeviceDelegate方法:
DidReceiveReadResultFromReader(CMBReaderDevice reader, CMBReadResults readResults)
要简单地显示ReadResult扫描条形码后:
公共空间DidReceiveReadResultFromReader (CMBReaderDevice读者,CMBReadResults 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属性。字节存储为“full_string”标记下的Base64字符串。
默认情况下,图像和SVG结果是禁用的,这意味着在扫描时,CMBReadResults不会在相应的属性中包含任何数据。
要启用图像结果,请使用以下方法从CMBReaderDevice类中设置ImageResultEnabled属性:
readerDevice。图像ResultEnabled = false;
要启用SVG结果,请使用以下方法从CMBReaderDevice类设置imageResultEnabled属性:
readerDevice。年代VGResultEnabled = false;
可能会出现由于电池电量不足或手动断开电缆而导致设备断开的情况。这些情况可以通过ConnectionStateDidChangeOfReader的回调ICMBReaderDeviceDelegate.
从非活动状态返回应用程序后,阅读器设备保持初始化,但没有连接。不需要重新初始化SDK,但需要重新连接。
某些iOS版本会在恢复应用程序时发送“可用性”通知,说明外部附件可用。你可以在ICMBReaderDeviceDelegate方法:void AvailabilityDidChangeOfReader(CMBReaderDevice reader)w当阅读器可用时,您就可以连接了。
例如:
public void AvailabilityDidChangeOfReader(CMBReaderDevice reader) {if (readerDevice。可用性== cmbreaderavailable。Available) { readerDevice.ConnectWithCompletion((error) => { if (error != null) { // handle connection error } }); } }
有些iOS版本不会在简历上报告可用性变化,所以你需要手动处理。为UIApplicationDidBecomeActiveNotification和连接。
例子:
public override void ViewDidLoad() {base.ViewDidLoad();UIApplication NSNotificationCenter.DefaultCenter.AddObserver(。DidBecomeActiveNotification AppBecameActive);} void AppBecameActive(NSNotification obj) {if (readerDevice != null && readerDevice. obj)可用性== cmbreaderavailable。可用&&阅读器设备。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文件(应用程序名称,应用程序图标,最小和最大安卓版本),确保启用相机的许可.
对于iOS平台的特定项目,我们也应该这样做。打开你的Info.plist文件和设置一些项目属性为您的需要(应用程序名称,部署目标等。)
一定要加上相机的许可。在Visual Studio中,没有从这里添加此权限的选项。你需要打开你的Info.plist在一些文本编辑器中文件并添加这些行:
NSCameraUsageDescription 用于扫描的摄像头
如果您使用MX设备作为阅读器设备,请在Info.plist中添加以下协议:
UISupportedExternalAccessoryProtocols com.cognex。Dmcc com.demo.data . Dmcc com.demo.data
在将你的应用上传到app Store之前,请检查这个部分:让MX移动终端应用进入应用商店
我们将SDK作为nuget包发布https://www.nuget.org.请安装Cognex.cmbSDK.XamarinForms该解决方案内的Nuget包。安装包时选择所有三个项目。
注意:如果你到目前为止使用的是本地XamarinDataManLibrary.dll,现在你想更新SDK,请首先删除平台特定项目中对XamarinDataManLibrary.dll的引用,然后安装nuget包。另外,如果你在scannertrol .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文件的application标签下添加以下一行:
<应用>…
对于iOS,在项目特定的信息中添加它作为一个键值。plist文件:
MX_MOBILE_LICENSE 您的license密钥 . key>MX_MOBILE_LICENSE
//当一个MX-1xxx设备变得可用(USB电缆被插入,或MX设备被打开),//或当一个MX-1xxx之前可用已经变得不可用(USB电缆被拔出,由于不活动或电池耗尽而关闭)时调用。if (availability == ScannerAvailability.Available) {ConnectToScannerDevice();} else if (availability == ScannerAvailability.Unavailable) {DisplayAlert("设备不可用",null, "OK");}} //连接方法已经完成,在这里你可以看到建立连接是否有错误// (args:scanerexceptions exception, string errorMessage) public void OnConnectionCompleted(对象sender,对象[]args){//如果我们有有效的连接错误参数将为空,//否则这里是错误,通知我们的问题,我们连接到扫描仪If ((ScannerExceptions)args[0] != ScannerExceptions. noexception){//如果必要,要求相机权限(仅android,对于iOS我们处理来自SDK的权限)if ((ScannerExceptions)args[0] == ScannerExceptions. camerapermissionexception) RequestCameraPermission();else {Debug.WriteLine(args[1].ToString());UpdateUIByConnectionState (ScannerConnectionStatus.Disconnected);}}} //当与扫描器的连接被改变时调用。OnConnectionStateChanged(对象sender, ScannerConnectionStatus状态){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(ScannerAvailability参数)
建议使用MX移动终端扫描条形码。但是,cmbSDK还支持使用移动设备的内置摄像头。这包括支持可选的外部瞄准器或照明,以及自定义直播预览的外观。
若要使用移动设备的内置摄像头扫描条形码,请初始化扫描设备对象使用scannerControl。GetPhoneCameraDevice方法。相机读取器初始化时有几个选项。需要配置以下参数:
的ScannerCameraMode参数的类型为ScannerCameraMode枚举,它接受下表中列出的值之一。
这些模式为扫描仪提供了以下默认设置:
根据所选择的模式,设置额外的照明选项和行为,也列在表格中。
价值 | 描述 | 照明 | 直播预览 |
---|---|---|---|
NoAimer | 初始化阅读器以在移动设备屏幕上使用实时流预览,以便用户可以将条形码定位在摄像机的视野内以进行检测和解码。如果移动设备没有瞄准配件,请使用此模式。 | 照明是可用的,一个按钮来控制它是可见的直播流预览。 | 显示 |
如果命令被发送给阅读器进行瞄准器控制,则它们将被忽略。 | |||
PassiveAimer | 初始化读取器以使用被动瞄准器。在这种模式下,设备屏幕上没有直播预览,因为瞄准模式是投影的。 | 照明是不可用的,并且直播预览没有照明按钮。 | 不显示 |
如果命令被发送到阅读器进行照明控制,它们将被忽略,因为在这种模式下,假设移动设备的内置LED被用于瞄准器。 | |||
ActiveAimer (仅适用于iOS) |
时,直播预览将不会显示StartScanning ()方法默认调用。 | 照明是可用的,如果一个预览选项相机预览启用,照明控制按钮也是可用的。 | 不显示 |
接受照明或瞄准器控制命令。 | |||
FrontCamera | 初始化阅读器以使用移动设备的前置摄像头(如果可用)。使用这种配置时要小心,因为大多数前置摄像头都没有自动对焦和照明,提供的图像分辨率也明显较低。照明在此模式下不可用。 | 使用前置摄像头。 | 显示 |
照明是不可用的,实时流预览没有照明按钮。 | |||
如果命令被发送到阅读器用于瞄准器或照明控制,它们将被忽略。 |
扫描仪PreviewOption参数的类型为ScannerPreviewOptionenum,用于更改阅读器的默认值或覆盖从所选扫描器派生的默认值CameraMode.您可以指定以下选项:
价值 | 描述 |
---|---|
违约 | 接受CameraMode设置的所有默认值。 |
NoZoomButton | 隐藏实时流预览上的缩放按钮,防止用户调整移动设备相机的缩放。 |
NoIlluminationButton | 隐藏直播预览上的照明按钮,防止用户切换照明。 |
HardwareTrigger | 启用模拟硬件触发器(音量降低按钮),以便在移动设备上开始扫描。这个按钮只在按下时才开始扫描,不需要像专用扫描仪的触发器那样按住它,第二次按下它也不会停止扫描过程。 |
停顿了一下 | 如果使用实时流预览,则在startScanning ()方法调用,但是直到用户按下屏幕上的按钮开始扫描过程时,阅读器才开始解码。 |
AlwaysShow | 即使选择了瞄准模式(例如CameraMode == PASSIVE_AIMER),也会强制显示实时流预览。 |
PessimisticCaching | 使用更高分辨率的设备摄像头,在支持它的设备上将默认的1280x720分辨率更改为1920x1080,在不支持它的设备上更改为默认分辨率。这可以帮助扫描小条形码,但增加解码时间,因为每帧有更多的数据需要处理。 |
HighResolution (仅适用于iOS) |
使用较高分辨率的设备摄像头帮助扫描小条码,但解码时间较慢。该选项在支持该选项的设备上将分辨率设置为1920x1080,在不支持该选项的设备上将分辨率设置为默认值。默认分辨率为1280x720。 |
HighFrameRate | 使用设备的相机在60 FPS,而不是默认的30 FPS,以提供一个更流畅的相机预览。 |
ShowCloseButton | 在局部视图中显示关闭按钮。 |
如果全屏参数已设置真正的时,使用全屏预览,否则使用部分屏预览。
的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 . granting) {scannerControl.Connect();} else {if (Permissions.ShouldShowRationale()) {if (await DisplayAlert(null, "You need allow access to the Camera", "OK", "Cancel")) RequestCameraPermission();}}}
连接前,设置OnAvailabilityChanged,ConnectionStateChanged而且ConnectionCompleted事件处理程序。
public void OnAvailabilityChanged(对象发送者,ScannerAvailability可用性)public void OnConnectionStateChanged(对象发送者,ScannerConnectionStatus状态)public void OnConnectionCompleted(对象发送者,对象[]args)
方法初始化后调用connect方法ScannerDevice.
//在可以配置或使用扫描仪之前,需要建立一个连接private void ConnectToScannerDevice() {scannerControl.Connect();}
我们之前设置的事件处理程序将使用new调用ScannerDevice状态信息。
MX系列移动终端提供了复杂的设备配置和管理,包括保存在设备上的配置。MX设备是康耐视预先配置的,大多数符号和功能都可以使用。
如果您想要自定义配置,请通过DataMan安装工具或Cognex快速安装重新配置。这两种工具都可以轻松地将保存的配置分发到多个设备,以便进行简单的配置管理。
移动应用程序能够配置MX设备,让您选择:
cmbSDK使用一组默认选项用于移动设备的内置摄像头读取条形码。然而,有两个重要的区别需要记住:
MX-100是一款仅适用于iphone的设备外壳附件,为内置摄像头提供了额外的功能,如瞄准功能和更好的照明控制。作为MX设备和内置扫描仪的混合,MX-100具有存储在设备上的瞄准器强度、照明强度和瞄准器调制的设置,而其余的设置,如符号设置,存储在cmbSDK中。看到MX-100用户指南获取更多信息。
以下是使用MX-100设备时要记住的一些事情:
CmbSDK不启用任何象征学默认情况下,通过移动设备的内置摄像头读取条形码。必须启用应用程序需要扫描的所有条形码符号,以实现最佳扫描性能。
控件的以下方法可以启用单个符号ScannerControl类:
SetSymbologyEnabled(符号符号,bool启用)
此方法中用于符号参数的所有符号都可以在符号学枚举。
例子
//显式启用我们需要的符号。Datamatrix,真正的);scannerControl.SetSymbologyEnabled(象征。C128,真正的);
你也可以使用相同的方法禁用符号:
//显式禁用我们知道不需要的符号。Codabar、假);
你可以实现symbolologyenabled事件处理程序来检查符号改变的结果:
// SymbologyEnabled监听器(args: symbologysymbolology, bool isEnabled, string error) public void OnSymbologyEnabled(对象发送器,对象[]args) {if ((string)args[2] != null)调试。WriteLine("Failed to enable/disable " + args[0].ToString());else Debug.WriteLine(((symbolology)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命令,该命令返回两个值:一级缩放和二级缩放。
例子
scannerControl。年代endCommand("SET CAMERA.ZOOM-PERCENT 250 500");
获取/设置相机。变焦0 - 2另一个设置缩放级别或返回实际设置的命令。SET命令的取值包括:
您可以在扫描之前或甚至在扫描期间调用此命令,然后缩放上升到配置的级别。如果扫描完成,该值将重置为正常行为(0)。
例子
scannerControl。年代endCommand("SET CAMERA.ZOOM 2");
当使用移动设备的摄像头时,cmbSDK允许您在预览容器中或全屏查看摄像头预览。此预览还包含一个可定制的覆盖。cmbSDK相机覆盖功能按钮缩放,闪烁和关闭扫描仪,以及一个进度条指示扫描超时。
使用cmbSDK v2.0中最初使用的遗留摄像头覆盖。x和ManateeWorks SDK,在初始化ScannerDevice之前使用这个:
private void CreateScannerDevice() {if (param_deviceClass == ScannerDevice.PhoneCamera) {scannerControl.SetOverlay(ScannerOverlay.LEGACY);scannerControl.GetPhoneCameraDevice (ScannerCameraMode。NoAimer ScannerPreviewOption。违约,真实);}
当使用cmbSDK覆盖时:
cmbSDK和遗留的覆盖都允许您更改缩放和闪光按钮上使用的图像,如果您的图像具有与cmbSDK使用的名称相同的名称。您可以在参考资料/中找到cmbSDK中使用的图像和名称必威随行版官网drawable-mdpi而且drawable-hdpiAndroid和Resources/的目录必威随行版官网MWBScannerImages.xcassetsiOS。
cmbSDK和遗留的覆盖层都允许您更改检测到条形码时显示的矩形的颜色和宽度。这些更改需要在ConfigureScannerDevice()方法中完成(在我们有到扫描仪设备的有效连接之后)。
例子:
private void ConfigureScannerDevice(){扫描控制。System.Drawing.Color SetLegacyOverlayLocationLine(255。黄色,6.0f,真);...
康耐视扫描设备实现DataMan控制命令(DMCC),用于配置和控制设备。设备的每个功能都可以使用这种基于文本的语言进行控制。API提供了一种向设备发送DMC命令的方法。存在用于设置和查询配置属性的命令。DMC命令适用于所有平台和框架。
的附录包括完整的DMCC参考相机阅读器。
下面的例子展示了不同的DMCC发送到设备进行更高级的配置。
例子
//修改扫描方向为全向扫描控制。SendCommand("SET DECODER.1D-SYMBOLORIENTATION 0");//更改直播预览的扫描超时时间为10秒scannerControl. //SendCommand(“设置解码器。MAX-SCAN-TIMEOUT 10”);
你也可以设置responserecreceived事件处理程序来接收send命令的响应:
//发送DMCC命令(args: string payload, string error, string DMCC) public void onresponserecreceived (object sender, object[] args) {if ((string)args[1] != null)WriteLine(“执行DMCC失败”);其他调试。WriteLine("响应" +(字符串)args[2] + ": " +(字符串)args[0]);}
CmbSDK包括一个将设备重置为默认设置的方法。对于MX移动终端,默认配置为已保存的配置。对于内置摄像头,默认设置为附录,其中没有启用任何符号。
重置设备发送这个DMCC:
scannerControl.SendCommand(“CONFIG.DEFAULT”);
在使用MX移动终端时,我们可以区分三种状态:
有了正确配置的阅读器,就可以扫描条形码了。方法可以简单地实现这一点StartScanning ()方法。scannerControl.接下来会发生什么是基于类型ScannerDevice以及它是如何配置的。一般来说:
当满足下列条件之一时,扫描停止:
当条形码被成功解码时,您将在ReadResultReceived中收到ScannedResult列表事件:
//在扫描完成后调用,通过检测条形码,通过使用屏幕按钮或硬件触发按钮取消扫描,或者如果扫描超时公共void OnReadResultReceived(对象发送者,List结果)
要简单地显示ScannedResult扫描条形码后:
public void OnReadResultReceived(对象发送者,列表结果){if(结果。计数> 0){ScannedResult readResult =结果[0];lblCode。Text = readResult.ResultCode;}}
可能会出现由于电池电量不足或手动断开电缆而导致设备断开的情况。这些情况可以在ConnectionStateChanged事件处理程序。
从非活动状态返回应用程序后,阅读器设备保持初始化,但没有连接。不需要重新初始化SDK,但需要重新连接。对于iOS,我们在ScannerControl渲染器中这样做,而对于Android,当页面恢复时需要手动完成:
//当页面消失时,需要关闭与扫描设备的连接;因此,当我们恢复(再次出现此页)时,我们//必须恢复连接(假设我们有一个)。//这只用于android。/ /创建我们使用iOS观察者的ScannerControl类在iOS平台特定的项目 //---------------------------------------------------------------------------- 如果设备。RuntimePlatform ==设备。安卓&& await Permissions.CheckStatusAsync() == PermissionStatus.Granted) { ConnectToScannerDevice(); }