安卓是谷歌基于Linux内核开发的移动操作系统,主要为智能手机和平板电脑等触屏移动设备设计。Android的用户界面主要基于直接操作,使用触摸手势来操作屏幕上的对象,这些手势与现实世界的动作大致对应,比如滑动、敲击和捏捏,还有一个用于文本输入的虚拟键盘。除了触摸屏设备,谷歌还进一步开发了用于电视的Android TV,用于汽车的Android Auto和用于手表的Android Wear,每一个都有专门的用户界面。Android的各种版本也用于笔记本电脑、游戏机、数码相机和其他电子产品。
Android的源代码是由谷歌在开源许可下发布的,尽管大多数Android设备最终都带有免费、开源和专有软件的组合,包括访问谷歌服务所需的专有软件。安卓很受科技公司的欢迎,这些公司需要一款现成的、低成本的、可定制的高科技设备操作系统。它的开放性鼓励了大量的开发者和爱好者社区使用开源代码作为社区驱动项目的基础,这些项目为旧设备提供更新,为高级用户添加新功能,或者将Android带到最初与其他操作系统一起发布的设备上。Android设备的硬件种类繁多,导致软件升级的严重延迟,新版本的操作系统和安全补丁通常需要几个月的时间才能到达消费者手中,有时甚至根本不会。在科技公司之间所谓的“智能手机战争”中,Android的成功使其成为专利和版权诉讼的目标。
扩展设备功能的应用程序(“应用程序”)使用Android软件开发工具包(SDK)编写,通常使用Java编程语言。Java可以与C/ c++结合使用,同时还可以选择非默认运行时,以提供更好的c++支持。它还支持Go编程语言,尽管只有一组有限的应用程序编程接口(API)。2017年5月,谷歌宣布支持Kotlin编程语言的Android应用程序开发。
SDK包括一套全面的开发工具,包括调试器、软件库、基于QEMU的手机模拟器、文档、示例代码和教程。最初,b谷歌支持的集成开发环境(IDE)是使用Android开发工具(ADT)插件的Eclipse;2014年12月,b谷歌发布了基于IntelliJ IDEA的Android Studio,作为其Android应用开发的主要IDE。其他开发工具可用,包括用于C或c++应用程序或扩展的本机开发工具包(NDK),谷歌App Inventor,面向新手程序员的可视化环境,以及各种跨平台移动web应用程序框架。2014年1月,b谷歌发布了一个基于Apache Cordova的框架,用于将ChromeHTML 5 web应用程序移植到Android上,并封装在一个本地应用程序外壳中。
的康耐视移动条码SDK(cmbSDK)是一个简单而强大的工具,用于开发移动条码扫描应用程序。基于康耐视的旗舰DataMan技术和海牛工场条码扫描SDK, cmbSDK允许开发人员为整个移动扫描设备范围创建条码扫描应用程序:从智能手机和平板电脑到高性能工业条码扫描仪的MX系列。通过遵循一些简单的指导原则,开发人员可以编写适用于任何受支持的MX移动终端或智能手机的应用程序,只需很少或没有条件代码。SDK通过“阅读器”连接层对设备进行抽象来实现这一点:一旦应用程序与所需的阅读器建立了连接,就会使用一个统一的API来配置和连接设备。
SDK提供了两个基本的读取器:一个“MX读取器”用于使用MX-1000和MX-1502等设备进行条形码扫描,一个“相机读取器”用于使用移动设备的内置摄像头进行条形码扫描。
本文档中描述的软件是根据许可提供的,只能按照该许可的条款使用或复制,并包含本页所示的版权声明。本软件、本文件及其任何副本均不得提供给或以其他方式提供给除被许可方以外的任何人。本软件的所有权和所有权归康耐视公司或其许可方所有。康耐视公司对其软件在非康耐视公司提供的设备上的使用或可靠性不承担任何责任。康耐视公司对所描述的软件、其适销性、非侵权性或其适用于任何特定目的不作任何明示或暗示的保证。
本文件中的信息可随时更改,恕不另行通知,不应被解释为康耐视公司的承诺。康耐视公司不对本文档或相关软件中可能出现的任何错误负责。
除非另有说明,此处示例中使用的公司、名称和数据均为虚构的。未经康耐视公司书面许可,不得出于任何目的以任何形式或以任何电子或机械方式复制或传播本文件的任何部分,也不得将其转移到任何其他媒体或语言。
版权所有©2017。Cognex公司。版权所有。
康耐视提供的部分硬件和软件可能涉及一项或多项美国和外国专利,以及康耐视网站上列出的未决美国和外国专利://m.czl106.com/patents。
以下为康耐视公司的注册商标:
Cognex, 2DMAX, Advantage, AlignPlus, Assemblyplus, Check Check, Checker, Cognex Vision for Industry, Cognex VSOC, CVL, DataMan, DisplayInspect, DVT, EasyBuilder, Hotbars, IDMax, In-Sight, Laser Killer, mvs8000, OmniView, PatFind, PatFlex, PatInspect, PatMax, PatQuick, SensorView, SmartView, SmartAdvisor, SmartLearn, UltraLight, Vision Solutions, VisionPro, VisionView
以下为康耐视公司的商标:
康视徽标,1DMax, 3D-Locate, 3DMax, BGAII, CheckPoint,康视VSoC, CVC-1000, FFD, iLearn, In-Sight(十字十字设计标志),In-Sight 2000, InspectEdge, Inspection Designer, MVS, NotchMax, OCRMax, PatMax RedLine, ProofRead, SmartSync, ProfilePlus, SmartDisplay, SmartSystem, SMD4, VisiFlex, expd
其他产品和公司商标是其各自所有者的商标。
该SDK支持康耐视的MX移动终端系列,包括MX-1000和MX-1502设备。您可以在康耐视的官方网站(//m.czl106.com).这些设备关于cmbSDK使用的一些相关特性如下:
MX平台的以下特性结合在一起,使得使用它们进行应用程序开发非常简单。
MX移动终端通过设备的usb或闪电端口连接到您的设备。这意味着当应用程序运行时,端口将被占用。还有其他调试应用程序的方法,我们将在下面讨论如何通过wifi进行调试。
Android上的调试:
这将与Android Studio, Eclipse, Xamarin或任何其他可以运行Android应用程序。首先通过USB连接你的android设备,确保你可以使用USB线运行和调试你的应用程序。从android工具中打开adb,这是我们将使用的设备连接而不使用usb电缆。
警告使无线调试选项启用是危险的,任何人在你的网络可以连接到你的设备调试,即使你是在数据网络。只有在连接到受信任的Wi-Fi时才这样做,并记住在完成后断开它(使用步骤#5)!
重要的是要认识到,作为条形码扫描设备,智能手机(和平板电脑)的功能有几个根本的区别。这些差异导致用户体验不同于专用扫描仪,从而影响移动条码扫描应用程序的设计。
这些差异以及它们对您的应用程序的一般影响如下:
cmbSDK经过专门设计,使这些差异对应用程序开发人员和用户尽可能透明。通过遵循一些简单的指导方针,可以开发工作和行为相同的应用程序,无论是使用MX-1000移动终端,还是仅使用设备的内置摄像头。
如果没有硬件触发器,移动设备必须使用替代方法来启动条形码扫描。常用的范例有三种:
cmbSDK支持所有这三种方法,其中任何一种(或多种)都可以在应用程序中使用。
如前所述,与专用扫描仪不同,移动设备没有内置瞄准器。条形码瞄准通常是通过在移动设备显示器上提供来自摄像头的实时流预览来完成的:然后用户可以重新定位设备,直到条形码出现在视野中并被解码。
cmbSDK大大简化了这项任务,因为它提供了一个内置的预览控件,可以全屏显示、局部显示、纵向显示或横向显示。
cmbSDK还支持“被动”瞄准器:连接到移动设备或移动设备外壳的设备,使用设备的LED闪光灯作为光源来投射瞄准/瞄准模式。这些类型的瞄准器的优点是不再需要屏幕上的预览(因为移动设备现在可以投射类似于专用扫描仪的瞄准器模式)。然而,被动瞄准器的一个限制是,由于移动设备闪光灯被用于瞄准器,使用LED闪光灯进行一般扫描照明是不可用的。
移动设备支持开发纵向、横向或在两者之间自动旋转的应用程序。cmbSDK完全支持条形码预览和扫描方向的所有三个选项。如前所述,无论应用程序和/或移动设备的方向如何,大多数条形码都可以被移动设备扫描。
但是,在某些情况下,使用横向定向可能是有利的,甚至是必要的。在人像模式下,移动相机沿着图像的“高度”有更高的分辨率。例如,常用的分辨率是1280x720。当以纵向模式扫描条形码时,这意味着沿水平轴有720像素的数据可用于条形码解码。如果扫描一个特别长的或密集的条形码(例如一个大的PDF417),使用横向方向在水平扫描线上提供1280像素。当扫描QR、Data Matrix和MaxiCode等“方形”条形码时,方向几乎没有区别。
如今的智能手机和平板电脑拥有强大的计算能力。凭借多核cpu甚至专用图像处理器,它们为经济高效的条形码解码提供了理想的平台。尽管这些设备功能强大,但仍建议开发人员考虑优化其条形码扫描应用程序。虽然SDK已经针对移动环境进行了优化,但图像分析和条形码解码仍然是一项CPU密集型活动:由于这些进程必须与操作系统、服务和其他应用程序共享移动设备CPU,开发人员应该限制他们的应用程序只使用满足他们需求的SDK功能。
应用程序优化包括以下内容:
由于这些原因,当初始化cmbSDK以便与移动设备的内置摄像头一起使用时,默认情况下不启用条形码符号:应用程序必须显式启用它所需的符号。由于大多数条形码扫描应用程序实际上只需要扫描少数几个符号,这种行为引导开发人员以有效的方式使用SDK。
启用符号是一个非常简单的过程,本文稍后将对此进行解释。
安装Android cmbSDK的步骤如下:
如果您计划使用cmbSDK在智能手机或平板电脑(没有MX移动终端)上进行移动扫描,那么SDK需要安装许可密钥。没有许可密钥,SDK仍将运行,尽管扫描结果将被混淆(SDK将随机用星号字符替换扫描结果中的字符)。
请与您的康耐视销售代表联系,了解如何获取许可密钥,包括可用于评估SDK的30天试用许可。
获得许可密钥后,在应用程序的AndroidManifest.xml文件中添加以下行,在应用程序标签下:
接下来,将密钥放在YOUR_MX_MOBILE_LICENSE的位置。
.
以前的SDK版本通过USB Device或USB Accessory直接连接MX移动终端。这些方法现在已弃用,您应该使用MXConnect应用程序连接到MX移动终端。(见步骤4。)
cmbSDK提供了一个简单的工厂方法DataManSystem. createdatamansystemformxdevice(),通过MXConnect应用程序为MX移动终端创建一个DataManSystem。
请从您的项目中删除任何DataManSystem.createDataManSystemOverUsb()和DataManSystem.createDataManSystemOverUsbAccessory()方法,并从AndroidManifest.xml文件中删除USB_ DEVICE-ATTACHED和USB_ACCESSORY_ATTACHED意图过滤器和元数据。
还可以从xml文件夹中删除USB和附件描述符xml文件。您也可以使用并迁移到Barcode SDK来访问MX移动终端。
cmbSDK旨在为支持的扫描设备提供高级抽象接口。这不仅包括MX系列的移动终端,还包括打算使用移动设备相机作为成像设备的应用。与这些设备通信和管理这些设备的复杂性被封装在SDK本身中:让应用程序只连接到所选择的设备,然后使用它。
应用程序和受支持的条形码扫描设备之间的主要接口是ReaderDevice类。这个类代表了设备本身的抽象层,处理所有通信以及任何必要的硬件管理(例如智能手机扫描)。
cmbSDK的使用步骤如下:
为要使用的设备类型初始化阅读器设备(MX阅读器或相机阅读器)。
连接阅读器设备
配置阅读器(如果需要)。
开始扫描。
初始化、连接和配置通常只需要在应用程序中执行一次,以下情况除外:
执行以下步骤设置并开始使用cmbSDK:
进口com.cognex.dataman.sdk.CameraMode;进口com.cognex.dataman.sdk.ConnectionState;进口com.cognex.dataman.sdk.PreviewOption;进口com.cognex.mobile.barcode.sdk.ReadResult;进口com.cognex.mobile.barcode.sdk.ReadResults;进口com.cognex.mobile.barcode.sdk.ReaderDevice;进口com.cognex.mobile.barcode.sdk.ReaderDevice.Availability;进口com.cognex.mobile.barcode.sdk.ReaderDevice.OnConnectionCompletedListener;进口com.cognex.mobile.barcode.sdk.ReaderDevice.ReaderDeviceListener;进口com.cognex.mobile.barcode.sdk.ReaderDevice.Symbology;
提供所需的UI元素:
ImageView嵌套在ViewGroup具有匹配大小的父容器,用于显示预览或扫描会话的最后一帧;
下面的例子使用了以下用法:
private RelativeLayout rlPreviewContainer;私有ImageView ivPreview;
3.以下接口是监控读取器连接状态和接收读取码信息所必需的:
公共类scaneractivity扩展Activity实现OnConnectionCompletedListener, ReaderDeviceListener {....@Override公共空onConnectionCompleted (ReaderDevice读者,可抛出错误){如果(错误! = null){/ /读者断开连接(错误发生)}}@Override公共空onConnectionStateChanged (ReaderDevice读者){如果(reader.getConnectionState () = = ConnectionState.Connected){/ /读者连接}else if (reader.getConnectionState () = = ConnectionState.Disconnected){/ /读者断开}}@Override公共空onReadResultReceived (ReaderDevice读者,ReadResults results) {if (results. getcount () >) {ReadResult result = results. getresultat (0);//使用字符串symbolyname;字符串的代码;位图框架;应用程序中的变量if (result.isGoodRead()) {String symbolyname;字符串代码= result.getReadString();Symbology = result.getSymbology();if (symbolology != null) {symbologyName = symbolology . getname (); tvSymbology.setText(symbologyName); } else { tvSymbology.setText("UNKNOWN SYMBOLOGY"); } tvCode.setText(code); } else { tvSymbology.setText("NO READ"); tvCode.setText(""); } Bitmap frame = result.getImage(); ivPreview.setImageBitmap(frame); } // READY TO SCAN AGAIN } @Override public void onAvailabilityChanged(ReaderDevice reader) { if (reader.getAvailability() == Availability.AVAILABLE) { // READER DEVICE IS AVAILABLE AND CAN BE CONNECTED } else { // DISCONNECT DEVICE } } .... }
4.实例化ReaderDevice对象。
cmbSDK提供了两种不同的阅读器类初始化器:一种用于使用MX移动终端(如MX- 1000或MX-1502)进行扫描,另一种用于使用移动设备(Android手机,Android平板电脑等)的内置摄像头进行扫描。
使用下面的工厂方法初始化MX阅读器的Reader Device对象:
布尔值listeningForUSB = false;ScannerActivity。readerDevice = readerDevice . getmxdevice (ScannerActivity.this);if (!listeningForUSB) {readerDevice.startAvailabilityListening();listeningForUSB = true;}
MX移动终端的可用性可以在设备打开或关闭时改变,也可以在USB线连接或断开时改变。您可以使用以下ReaderDeviceListener接口方法(在以上第三步):
public void onAvailabilityChanged(ReaderDevice reader);
使用移动设备内置摄像头进行条码扫描可能比使用MX移动终端更复杂。cmbSDK支持多种配置,以提供最大的灵活性。这包括对可选的外部瞄准/照明的支持,以及自定义直播预览外观的能力。
要使用移动设备的内置摄像头扫描条形码,请使用getPhoneCameraDevice静态方法初始化ReaderDevice对象。初始化时,相机读取器有几个选项。需要配置以下参数:
Context参数只是提供对当前所处活动的引用。
CameraMode参数的类型是CameraMode(定义在CameraMode.java),并接受以下值之一:
PASSIVE_AIMER:这将初始化读者使用被动瞄准器,这是一种附加在移动设备或移动设备外壳上的附件,使用移动设备内置的LED闪光灯作为光源投射瞄准模式。在这种模式下,设备屏幕上不会显示直播预览,因为瞄准模式会被投影出来。
FRONT_CAMERA:这将初始化阅读器使用设备的移动前置摄像头,如果可用的话(并非所有移动设备都有前置摄像头)。这是一个不寻常的,但可能的配置。大多数前置摄像头没有自动对焦和照明,提供的图像分辨率明显较低。此选项应谨慎使用。在此模式下,照明不可用。
以上所有模式都为阅读器提供以下默认设置:
根据选择的模式,可以设置以下附加选项和行为:
的PreviewOption参数类型为PreviewOption(定义在PreviewOption.java),并用于更改读取器的默认值或覆盖从所选的派生的默认值CameraMode。在传递参数时,可以通过OR-ing来指定多个选项。可用的选项有:
ViewGroup类型的最后一个参数指定实时流预览的容器。
例子
创建一个阅读器,没有瞄准,没有缩放按钮,并使用一个软触发:
ScannerActivity。readerDevice =阅读器设备。getPhoneCameraDevice (ScannerActivity。这个,CameraMode。NO_AIMER, PreviewOption.NO_ZOOM_BUTTON | PreviewOption.PAUSED, rlPreviewContainer);
这开始与扫描仪暂停预览和软触发按钮切换扫描。按下软触发按钮后,rlPreviewContainer应该是这样的:
上图中的取景器具有活动扫描表面,这是具有设置活动符号的结果。有关此主题的详细信息,请参见配置读写设备).
在Android 6.0及以上版本中,你需要向用户请求访问手机摄像头的权限。
如果由于权限问题导致手机摄像头无法打开onConnectionCompleted (readerDevice错误)回调包含CameraPermissionException在error参数中。
方法检查此异常类型运算符操作员并请求活动内的许可。
如果(error instanceof CameraPermissionException) ActivityCompat.requestPermissions(((ScannerActivity) this), new String[]{Manifest.permission. permission. permission. error)相机},REQUEST_PERMISSION_CODE);
请注意,您需要实现ActivityCompat。OnRequestPermissionResultCallback接口,以捕获用户权限结果。
中处理用户响应onRequestPermissionResult(…),您可以使用以下代码重试连接到PhoneCamera。
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {if (requestCode == REQUEST_PERMISSION_CODE) {if (grantResults。长度> 0 && grantResults[0] == packagemanager . permission_grant) {if (readerDevice != null && readerDevice. getconnectionstate () != ConnectionState.Connected) readerDevice.connect(ScannerActivity.this);} else {if (activitypat . shouldshowrequestpermissionrationale (((ScannerActivity) this), Manifest.permission.CAMERA)) {AlertDialog. AlertDialog。Builder Builder = new AlertDialog.Builder(this) . setmessage("你需要允许访问相机"). setpositivebutton ("OK", new DialogInterface. onclicklistener () {@Override public void onClick(DialogInterface, DialogInterface, int i) {activitycompate . requestpermissions (ScannerActivity. permission)。this, new String[]{Manifest.permission。相机},REQUEST_PERMISSION_CODE);}}) .setNegativeButton("Cancel", null);AlertDialog dialog = builder.create();dialog.show ();} } } }
在连接之前,设置ReaderDeviceListener对象,以便接收事件:
readerDevice.setReaderDeviceListener (ScannerActivity.this);
看到步骤3获取详细信息。
此外,您可以启用从阅读器发送最后触发的图像:
readerDevice.enableImage(真正的);
在初始化ReaderDevice并设置一个监听器方法来处理阅读器的响应之后,可以调用connect方法,它接受一个OnConnectionCompletedListener(参见步骤3)作为参数:
//确保设备已打开并准备就绪readerDevice.connect(ScannerActivity.this);
如果一切操作正确,将使用新的ReaderDevice状态信息调用以下侦听器方法。onConnectionCompleted方法(作为connect的参数传递)也将在连接过程完成时被调用,如果存在连接错误,则提供一个Throwable对象。
public void onconnectionstatechange (ReaderDevice阅读器);onConnectionCompleted(ReaderDevice reader, Throwable error
激活扫描
readerDevice.startScanning ();
您可以使用以下命令停止扫描:
readerDevice.stopScanning ();
onReadResultReceived侦听器方法(参见步骤3)将被调用,因为条形码已被
读取器,或者扫描过程已完成。
连接到扫描设备后,您可能希望(或需要)更改其某些设置。cmbSDK提供了一组高级的、与设备无关的api,用于设置和检索设备的当前配置。
与初始化Reader Device的情况类似,使用MX阅读器和相机阅读器进行扫描也存在一些差异。下面几节将详细介绍这些差异。
MX系列移动终端提供了完善的设备配置和管理功能,包括保存设备本身的配置。一般来说,这些设备来自康耐视预先配置为一个特殊的开箱即用的体验,大多数符号和功能准备使用。
当需要自定义重新配置时,通常使用DataMan Setup Tool或DataMan Quick Setup来完成,因为这些工具可以轻松地将保存的配置分发到多个设备,从而大大简化了配置管理。
但是,移动应用程序本身仍然可以(有时也是可取的)配置MX设备:
与MX移动终端非常相似,cmbSDK使用了一组默认选项,用于使用移动设备的内置摄像头读取条形码,从而提供了良好的开箱即用体验。然而,有两个重要的区别需要记住:
cmbSDK不启用象征学默认情况下:作为应用程序程序员,您必须启用应用程序需要扫描的所有条形码符号。通过要求应用程序明确地只启用它需要的符号,可以实现最优的扫描性能。这个概念在概述部分。
单个符号可以使用Reader Device对象的以下方法启用:
setSymbologyEnabled(最终的Symbology,最终的boolean启用,最终的OnSymbologyListener侦听器)。DATAMATRIX, true, null);readerDevice.setSymbologyEnabled(象征。UPC_EAN, true, null);
此方法中用于symbology参数的所有符号都可以在ReaderDevice.java。
例子
/*启用QR扫描*/ readerDevice.setSymbologyEnabled(symbologyenabled)QR, true, null);
同样的方法也可以用来关闭符号:
/ *禁用代码25扫描*/ readerDevice.setSymbologyEnabled(symbologyenabled)C25, false, null);
你可以实现OnSymbologiesListener的方法:
@Override public void onSymbologyEnabled(ReaderDevice reader, Symbology Symbology, Boolean enabled, Throwable error) {if (error != null){/*不成功,可能当前设备不支持该符号,或者ReaderDevice和MX设备之间的连接有问题*/}else{//成功}}
cmbSDK包含一个将设备重置为默认设置的方法。在MX移动终端的情况下,这是默认保存的配置(而不是出厂默认值),而在内置摄像头的情况下,这些是在附录B,其中不启用任何符号。这种方法如下:
readerDevice.resetConfig(空);
作为一个异步方法,您可以使用作为可选参数传递给方法的OnResetConfigListener接口来监视它的完成情况。
公共类扫描器扩展活动实现....OnResetConfigListener……{…@Override public void onResetConfigCompleted(ReaderDevice reader, Throwable error) {if (error != null){//不成功}else{//成功}}
如果您的阅读器设备配备了照明灯(例如led),您可以使用您的阅读器设备对象的以下方法在扫描开始时控制它们是开还是关:
readerDevice。setLightsOn(真的,null);
可选地,你可以为OnLightsListener实现接口方法,这是该方法的第二个参数。
公共类扫描器扩展活动实现....OnLightsListener……{…@Override public void onLightsOnCompleted(ReaderDevice reader, Boolean on, Throwable error) {if (error != null){//不成功}else{//成功}}}
请记住,并非所有由cmbSDK支持的设备和设备模式都允许照明控制。例如,如果在被动瞄准模式下使用内置摄像头,照明是不可用的,因为LED正在用于瞄准。
每个康耐视扫描设备都执行数据控制命令(DMCC),这是一种配置和控制设备的方法。实际上,设备的每个功能都可以使用这种基于文本的语言来控制。API提供了向设备发送DMCC命令的方法。设置和查询配置属性命令。
附录A包括与相机读取器一起使用的完整DMCC参考。其他支持设备(例如MX-1000)的DMCC命令包含在该特定设备的文档中。
附录B提供与相应的DMCC设置相关的相机读取器配置设置的默认值。
下面的示例显示了发送到设备的不同DMCC命令,以便进行更高级的配置。
例子
//将扫描方向改为全向readerDevice.getDataManSystem()。sendCommand("SET DECODER.1D-SYMBOLORIENTATION 0", ScannerActivity.this);//将直播预览的扫描超时改为10秒readerDevice.getDataManSystem()sendCommand(“设置解码器。MAX-SCAN-TIMEOUT10", ScannerActivity.this);
方法中调用DMCC查询命令并接收它们的响应OnResponseReceivedListener.onResponseReceived ()方法。
//获取连接的设备类型readerDevice.getDataManSystem()。sendCommand(“设备。名字", new OnResponseReceivedListener() { @Override public void onResponseReceived(DataManSystem dataManSystem, DmccResponse dmccResponse) { if (dmccResponse.getError() != null) { // Unsuccessful Log.e("DMCC_ERR", “GET DEVICE.NAME failed”,dmccResponse.getError()); } else { // Success - Use the following result fields: //int mResponseId = dmccResponse.getResponseId(); //String mPayLoad = dmccResponse.getPayLoad(); //byte[] mBinaryData = dmccResponse.getBinaryData(); } } ); }
有了正确配置的阅读器,现在就可以扫描条形码了。这可以通过从Reader Device对象调用startScanning方法来完成。
接下来发生的事情取决于阅读器设备的类型及其配置方式,但一般来说:
在下列情况之一时停止扫描:
当条形码被成功解码时(第一种情况),您将在ReaderDevice侦听器方法中收到一个ReadResults可迭代结果集合对象,该方法已经在步骤3。
@覆盖公共无效onReadResultReceived(ReaderDevice阅读器,ReadResults结果){if (results. getcount () >) {ReadResult结果= results. getresultat (0);//使用字符串symbolyname;字符串的代码;位图框架;应用程序中的变量if (result.isGoodRead()) {String symbolyname;字符串代码= result.getReadString();Symbology = result.getSymbology();if (symbolology != null) {symbologyName = symbolology . getname ();tvSymbology.setText (symbologyName);} else {tvSymbology。setText("UNKNOWN SYMBOLOGY"); } tvCode.setText(code); } else { tvSymbology.setText("NO READ"); tvCode.setText(""); } Bitmap frame = result.getImage(); ivPreview.setImageBitmap(frame); } // READY TO SCAN AGAIN }
在上面的例子中,ivPreview是一个ImageView,用于显示扫描的条形码图像,tvCode是一个TextView,用于显示条形码的结果。还可以使用result.isGoodRead()中的BOOL值来检查扫描是否成功。
当条形码被成功读取时,将创建一个ReadResult对象,并由onReadResultReceived方法返回。如果在单个图像/帧上成功读取多个条形码,则在ReadResult对象中返回多个ReadResult对象。
ReadResult类具有描述读取条形码结果的属性:
当扫描结束而没有成功读取时,aReadResult与goodRead属性设置为false。这通常发生在扫描被取消或超时时。
属性中填充image和imageGraphics属性ReadResult对象,你必须设置相应的enableImage ()和/或enableImageGraphics ()ReaderDevice对象属性。
要查看如何并行使用和显示图像和SVG图形的示例,请参阅SDK包中提供的样例应用程序。
并非所有受支持的设备都提供SVG图形。
要访问扫描条形码中的原始字节,可以使用XML属性。字节以Base64 String的形式存储在“full_string”标签下。下面是如何使用XML解析器从XML属性提取原始字节的示例。
try {XmlPullParserFactory factory = XmlPullParserFactory. newinstance ();factory.setNamespaceAware(真正的);XmlPullParser xpp = factory.newPullParser();字符串标签= "";//原始字节将存储在这个变量byte[] bytes中;xpp。setInput(新StringReader (result.getXml ()));int eventType = xpp.getEventType();while (eventType != XmlPullParser.END_DOCUMENT) {if (eventType == XmlPullParser.START_TAG) {tag = xpp.getName();} else if (eventType == XmlPullParser。TEXT && tag.equals("full_string")) { String base64String = xpp.getText(); // Get the bytes from the base64 string here bytes = Base64.decode(base64String, Base64.DEFAULT); break; } else if (eventType == XmlPullParser.END_TAG && tag.equals("full_string")) { tag = ""; break; } eventType = xpp.next(); } } catch (Exception e) { e.printStackTrace(); }
默认情况下,图像和SVG结果是禁用的,这意味着在扫描时,ReadResults将不包含相应属性中的任何数据。
要启用图像结果,请从ReaderDevice对象调用enableImage()方法:
readerDevice.enableImage(真正的);
要启用SVG结果,调用ReaderDevice对象上的enableImageGraphics()方法:
readerDevice。enableImageGraphics(真正的);
可能存在由于电池电量不足或手动断开电缆而导致设备断开的情况。这些病例可以通过onConnectionStateChanged ()方法ReaderDeviceListener接口。
下表列出了使用内置摄像头进行条码扫描时cmbSDK支持的各种DMCC命令。
获取/设置 |
命令 |
参数(年代) |
描述 |
|
---|---|---|---|---|
获取/设置 |
电池。负责 |
以百分比形式返回设备的当前电池电量。 |
||
哔哔的声音 |
播放可听到的哔(音)声。 |
|||
获取/设置 |
哔哔的声音。好 |
(0 - 3) (0 - 2) |
设置蜂鸣声的数量(0-3)和蜂鸣声的音调/音调(0- 2,为低,中,高)。对于内置摄像头,只支持单一的蜂鸣声,不支持音高控制。因此,0 1关闭哔哔声,11 1打开哔哔声。 |
|
获取/设置 |
CODABAR。CODESIZE |
ON min max OFF min max |
接受任何长度的Codabar。 |
X |
获取/设置 |
C11。CHKCHAR |
开bbbboff |
打开/关闭代码11校验数字。 |
X |
获取/设置 |
C11。CHKCHAR-OPTION |
1 2 |
需要单个校验和。需要双重校验和。 |
X |
获取/设置 |
C11。CODESIZE |
ON min max OFF min max |
接受任何长度Code 11。 |
X |
获取/设置 |
这件。CODESIZE |
ON min max OFF min max |
接受任何长度Code 25。 |
X |
获取/设置 |
C39。美国信息交换标准代码 |
开bbbboff |
打开/关闭Code 39扩展ASCII。 |
|
获取/设置 |
C39。CODESIZE |
ON min max OFF min max |
接受任何长度Code 39。 |
|
获取/设置 |
C39。CHKCHAR |
开bbbboff |
打开/关闭代码39校验数字 |
|
获取/设置 |
C93。美国信息交换标准代码 |
开bbbboff |
打开/关闭代码93扩展ASCII |
X |
获取/设置 |
C93。CODESIZE |
ON min max OFF min max |
接受任何长度代码93。 |
|
配置。默认的 |
将大多数相机API设置重置为默认设置,除了那些未重置的设置(参见附录B)。要重置所有设置,请使用DEVICE.DEFAULT。 |
|||
获取/设置 |
数据。结果类型 |
0 1 2 4 8 |
指定返回的结果(多个值的和):无 XML数据 |
|
获取/设置 |
DATABAR。扩大 |
开bbbboff |
打开/关闭数据库扩展符号。 |
|
获取/设置 |
DATABAR。有限的 |
开bbbboff |
打开/关闭DataBar Limited符号。 |
|
获取/设置 |
DATABAR。RSS14 |
开bbbboff |
打开/关闭databarrss14符号。 |
X |
获取/设置 |
DATABAR。RSS14STACK |
开bbbboff |
打开/关闭DataBar RSS14堆叠符号。 |
X |
获取/设置 |
DECODER.1D——SYMBOLORIENTATION |
0 1 2 3 |
使用全向扫描方向。 |
获取/设置 |
命令 |
参数(年代) |
描述 |
|
获取/设置 |
译码器。努力 |
1 - 5 |
设置图像分析/解码的努力水平。默认值是2。不要使用4-5进行在线扫描。 |
X |
获取/设置 |
译码器。MAX-SCAN——超时 |
1 - 120 |
设置直播预览的超时时间。当达到超时时,解码暂停;直播预览将保持在屏幕上。 |
X |
设备。默认的 |
重置相机API设置为默认值(见附录B)。 |
|||
得到 |
设备。FIRMWARE-VER |
获取设备固件版本。 |
||
得到 |
设备。ID |
返回康耐视分配给扫描设备的设备ID。对于内置摄像头,SDK返回53。 |
||
获取/设置 |
设备。名字 |
返回分配给设备的名称。默认情况下,这是“MX-”加上DEVICE.SERIAL-NUMBER的最后6位数字。 |
||
得到 |
设备。串行-数 |
返回设备的序列号。对于内置摄像头,SDK分配一个伪随机数。 |
||
得到 |
设备。类型 |
返回康耐视分配给扫描设备的设备名称。对于内置摄像头,SDK返回“MX-Mobile”。 |
||
获取/设置 |
的焦点。FOCUSTIME |
清廉 |
设置相机的自动对焦周期(相机应该尝试重新对焦的频率)。默认值是3。 |
|
获取/设置 |
I2O5。CHKCHAR |
开bbbboff |
将交叉2 / 5位检查数字打开/关闭。 |
|
获取/设置 |
I205。CODESIZE |
ON min max OFF min max |
接受任何长度的交叉5的2。 |
X |
获取/设置 |
的形象。格式 |
0 1 2 |
扫描仪以位图格式返回图像结果。扫描仪返回JPEG格式的图像结果。扫描仪返回PNG格式的图像结果。 |
|
获取/设置 |
的形象。质量 |
10,15,20,90 |
指定JPEG图像质量。 |
|
获取/设置 |
的形象。大小 |
0 1 2 3 |
扫描仪返回全尺寸图像。扫描仪返回1 / 4大小的图像。扫描仪返回1/16大小的图像。扫描仪返回1/62大小的图像。 |
|
获取/设置 |
光。瞄准手 |
0 - 1 |
禁用/启用瞄准器(当扫描仪启动时)。 |
|
获取/设置 |
光。瞄准手-TIMEOUT |
0 - 600 |
以秒为单位的瞄准超时。 |
|
获取/设置 |
光。内部,使 |
开bbbboff |
启用/禁用照明(当扫描仪启动时)。 |
|
获取/设置 |
MSI。CHKCHAR |
开bbbboff |
打开/关闭MSI Plessey检查数字。 |
|
获取/设置 |
MSI。CHKCHAR-OPTION |
0 1 2 3 4 5 |
使用mod 10校验和 |
X |
获取/设置 |
MSI。CODESIZE |
ON min max OFF min max |
接受任何长度的MSI Plessey。 |
X |
获取/设置 |
的象征。AZTECCODE |
开bbbboff |
开启/关闭阿兹特克密码符号。 |
|
获取/设置 |
的象征。CODABAR |
开bbbboff |
打开/关闭Codabar符号。 |
|
获取/设置 |
的象征。C11 |
开bbbboff |
打开/关闭代码11符号。 |
X |
获取/设置 |
的象征。C128 |
开bbbboff |
打开/关闭代码128符号。 |
获取/设置 |
命令 |
参数(年代) |
描述 |
|
获取/设置 |
的象征。这件 |
开bbbboff |
打开/关闭代码25符号(标准)。 |
|
获取/设置 |
的象征。C39 |
开bbbboff |
打开/关闭代码39符号。 |
|
获取/设置 |
的象征。C93 |
开bbbboff |
打开/关闭代码93符号。 |
|
获取/设置 |
的象征。鸡笼 |
开bbbboff |
打开/关闭COOP符号(代码25变体)。 |
X |
获取/设置 |
的象征。DATAMATRIX |
开bbbboff |
打开/关闭数据矩阵符号。 |
|
获取/设置 |
的象征。DATABAR |
开bbbboff |
打开/关闭数据库扩展和有限符号。 |
|
获取/设置 |
的象征。DOTCODE |
开bbbboff |
打开/关闭DotCode符号。 |
|
获取/设置 |
的象征。国际航空运输协会 |
开bbbboff |
打开/关闭IATA符号(代码25变体)。 |
X |
获取/设置 |
的象征。倒 |
开bbbboff |
打开/关闭反转符号(代码25变体)。 |
X |
获取/设置 |
的象征。ITF14 |
开bbbboff |
打开/关闭ITF-14符号(代码25变体)。 |
X |
获取/设置 |
的象征。UPC-EAN |
开bbbboff |
打开/关闭UPC-A、UPC-E、EAN-8和EAN-13符号。 |
|
获取/设置 |
的象征。矩阵 |
开bbbboff |
打开/关闭矩阵符号(代码25变体)。 |
X |
获取/设置 |
的象征。MAXICODE |
开bbbboff |
打开/关闭MaxiCode符号。 |
X |
获取/设置 |
的象征。MSI |
开bbbboff |
打开/关闭MSI Plessey符号。 |
|
获取/设置 |
的象征。PDF417 |
开bbbboff |
打开/关闭PDF417符号。 |
|
获取/设置 |
的象征。地球 |
开bbbboff |
打开/关闭行星符号。 |
|
获取/设置 |
的象征。POSTNET |
开bbbboff |
打开/关闭POSTNET符号。 |
|
获取/设置 |
SYMBOL.4STATE-IMB |
开bbbboff |
打开/关闭智能邮件条码符号。 |
|
获取/设置 |
SYMBOL.4STATE-RMC |
开bbbboff |
打开/关闭皇家邮政编码符号。 |
|
获取/设置 |
的象征。QR |
开bbbboff |
打开/关闭QR和MicroQR符号。 |
|
获取/设置 |
触发器。类型 |
0 1 2 3 4 5 |
不支持不支持手动(默认)不支持不支持连续 |
|
获取/设置 |
UPC-EAN。EAN13 |
开bbbboff |
打开/关闭EAN-13符号。 |
X |
获取/设置 |
UPC-EAN。EAN8 |
开bbbboff |
打开/关闭EAN-8符号。 |
X |
获取/设置 |
UPC-EAN。UPC-A |
开bbbboff |
打开/关闭UPC-A符号。 |
X |
获取/设置 |
UPC-EAN。UPC-E |
开bbbboff |
打开/关闭UPC-E符号。 |
X |
获取/设置 |
UPC-EAN。UPCE1 |
开bbbboff |
打开/关闭UPC-E1符号。 |
|
获取/设置 |
UPCE——一个。补充 |
0 1 - 4 |
关闭UPC补充代码。打开UPC补充代码。 |
下表列出了SDK在相机读取器启动时使用的默认值。
设置 |
默认值 |
仅限设备复位? |
---|---|---|
哔哔的声音。好 |
11(打开哔哔声) |
|
C11。CHKCHAR |
从 |
|
C11。CHKCHAR-OPTION |
1 |
|
C39。美国信息交换标准代码 |
从 |
|
C39。CHKCHAR |
从 |
|
C93。美国信息交换标准代码 |
从 |
|
COM。DMCC-HEADER |
1(包含结果ID) |
Y |
COM。DMCC-RESPONSE |
0(扩展) |
Y |
数据。结果类型 |
1 |
Y |
DECODER.1D-SYMBOLORIENTATION |
1 |
|
译码器。努力 |
2 |
|
译码器。MAX-SCAN-TIMEOUT |
60 |
|
设备。名字 |
“MX-”+ DEVICE的后六位数字。序列号 |
|
象征学(象征。*) |
OFF(禁用所有符号) |
|
符号子类型(组):DATABAR。扩大 UPC-EAN。EAN8UPC-EAN。UPC-AUPC-EAN。UPC-EUPCE——一个。UPCE1 |
开,开,开,开,开 |
|
的焦点。FOCUSTIME |
3. |
|
I2O5。CHKCHAR |
从 |
|
的形象。格式 |
1 (JPEG) |
|
的形象。质量 |
50 |
|
的形象。大小 |
1(1/4尺寸) |
|
光。瞄准手 |
基于cameraMode的默认值:0:NoAimer和FrontCamera |
Y |
光。瞄准手-TIMEOUT |
60 |
|
光。INTERNAL-ENABLE |
从 |
设置 |
默认值 |
仅限设备复位? |
最小/最大代码长度 |
4月40日 |
|
MSI。CHKCHAR |
从 |
|
MSI。CHKCHAR-OPTION |
0 |
|
触发器。类型 |
2(手动) |
|
UPC-EAN。补充 |
0 |
安装康耐视产品时,请遵守以下注意事项,以降低受伤或设备损坏的风险: