安卓是谷歌开发的一款基于Linux内核的移动操作系统,主要为智能手机和平板电脑等触屏移动设备设计。Android的用户界面主要基于直接操作,使用与现实世界动作大致对应的触摸手势(如滑动、轻敲和捏)来操作屏幕上的对象,以及用于文本输入的虚拟键盘。除了触屏设备,谷歌还进一步开发了用于电视的Android TV、用于汽车的Android Auto和用于手表的Android Wear,每个都有专门的用户界面。安卓系统的变体也被用在笔记本电脑、游戏机、数码相机和其他电子产品上。
Android的源代码是由谷歌在开源许可下发布的,尽管大多数Android设备最终都附带了免费、开源和专有软件的组合,包括访问谷歌服务所需的专有软件。Android在需要为高科技设备提供现成、低成本和可定制操作系统的科技公司中很受欢迎。它的开放性鼓励了大量的开发人员和爱好者使用开源代码作为社区驱动项目的基础,这些项目为旧设备提供更新,为高级用户添加新功能,或将Android引入最初与其他操作系统一起发布的设备。Android设备硬件的广泛变化导致软件升级的严重延迟,新版本的操作系统和安全补丁通常需要几个月才能到达消费者手中,有时甚至根本就没有。在科技公司之间所谓的“智能手机战争”中,安卓的成功使其成为专利和版权诉讼的目标。
应用程序(“apps”)扩展了设备的功能,使用Android软件开发工具包(SDK)编写,通常使用Java编程语言。Java可以与C/ c++结合使用,还可以选择非默认运行时,以便更好地支持c++。Go编程语言也得到了支持,尽管只有一组有限的应用程序编程接口(API)。2017年5月,谷歌宣布支持Kotlin编程语言开发Android应用程序。
SDK包括一套全面的开发工具,包括调试器、软件库、基于QEMU的手机模拟器、文档、示例代码和教程。最初,谷歌支持的集成开发环境(IDE)是Eclipse,使用Android开发工具(ADT)插件;2014年12月,谷歌发布了基于IntelliJ IDEA的Android Studio,作为其主要的Android应用开发IDE。还有其他可用的开发工具,包括用于C或c++中的应用程序或扩展的本地开发工具包(NDK),谷歌App Inventor,面向新手程序员的可视化环境,以及各种跨平台移动web应用程序框架。2014年1月,谷歌发布了一个基于Apache Cordova的框架,用于将ChromeHTML 5 web应用程序移植到Android,包装在原生应用程序外壳中。
的康耐视移动条码SDK(cmbSDK)是一个简单而强大的工具,用于开发移动条码扫描应用程序。cmbSDK基于康视的旗舰DataMan技术和Manatee Works条形码扫描SDK,允许开发人员为所有移动扫描设备创建条形码扫描应用程序:从智能手机和平板电脑到MX系列的高性能工业条形码扫描仪。通过遵循一些简单的指导原则,开发人员可以编写可以在任何受支持的MX移动终端或智能手机上工作的应用程序,只需很少或根本没有条件代码。SDK通过“阅读器”连接层抽象设备来实现这一点:一旦应用程序与所需的阅读器建立了连接,就会使用单一、统一的API来配置设备并与设备交互。
SDK提供了两个基本读取器:一个“MX读取器”,用于使用MX-1000和MX-1502等设备进行条形码扫描;一个“相机读取器”,用于使用移动设备的内置摄像头进行条形码扫描。
本文档中描述的软件是在许可下提供的,只能按照该许可条款使用或复制,并包含本页所示的版权声明。本软件、本文件及其任何副本均不得提供给或以其他方式提供给被许可方以外的任何人。本软件的所有权和所有权仍属于康耐视公司或其许可方。康耐视公司对其软件在非康耐视公司提供的设备上的使用或可靠性不承担任何责任。康耐视公司对所述软件、其适销性、非侵权性或适用于任何特定目的不作任何明示或暗示的保证。
本文件中的信息如有更改,恕不另行通知,不应被理解为康耐视公司的承诺。康耐视公司不对本文件或相关软件中可能出现的任何错误负责。
除非另有说明,本文示例中使用的公司、名称和数据均为虚构。未经康耐视公司书面许可,本文件的任何部分不得以任何形式或方式(电子或机械),为任何目的复制或传播,也不得转移到任何其他媒体或语言。
版权所有©2017。Cognex公司。版权所有。
康耐视提供的部分硬件和软件可能包含一项或多项美国和国外专利,以及康耐视网站上列出的美国和国外未决专利://m.czl106.com/patents.
以下为康耐视公司的注册商标:
Cognex, 2DMAX, Advantage, AlignPlus, Assemblyplus,用Checker, Checker检查,Cognex Vision for Industry, Cognex VSOC, CVL, DataMan, DisplayInspect, DVT, EasyBuilder, Hotbars, IDMax, In-Sight, Laser Killer, MVS-8000, 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, Xpand
本协议中标识的其他产品和公司商标均为其各自所有者的商标。
SDK支持康耐视的MX移动终端系列,包括MX-1000和MX-1502设备。你可以在康耐视的官方网站(//m.czl106.com).这些设备关于cmbSDK使用的一些相关特性如下:
MX平台的以下特性结合在一起使应用程序开发变得简单。
MX移动终端通过设备的usb或lightning端口连接到您的设备。这意味着该端口将在应用程序运行时被占用。还有其他调试应用程序的方法,我们将在下面讨论如何通过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个像素。在扫描二维码、数据矩阵和MaxiCode等“方阵”条形码时,方向几乎没有影响。
如今的智能手机和平板电脑拥有强大的计算能力。通过多核cpu和专用图像处理器,它们为具有成本效益和高效的条形码解码提供了理想的平台。尽管这些设备功能强大,但仍然建议开发人员考虑优化他们的条形码扫描应用程序。虽然SDK已经专门针对移动环境进行了优化,但图像分析和条形码解码仍然是一个CPU密集型活动:由于这些进程必须与操作系统、服务和其他应用程序共享移动设备CPU,因此开发人员应该限制其应用程序只使用满足其需求的SDK特性。
应用程序优化包括以下内容:
由于这些原因,在初始化cmbSDK以与移动设备的内置摄像头一起使用时,默认情况下不启用条形码符号:应用程序必须显式启用所需的符号。由于大多数条形码扫描应用程序只需要扫描少量符号,因此这种行为引导开发人员以一种有效的方式使用SDK。
启用符号是一个非常简单的过程,本文稍后将对此进行解释。
安装Android cmbSDK的步骤如下:
如果您计划使用cmbSDK在智能手机或平板电脑(没有MX移动终端)上进行移动扫描,那么SDK需要安装许可密钥。如果没有许可证密钥,SDK仍将运行,尽管扫描结果将被混淆(SDK将随机地用星号替换扫描结果中的字符)。
请与您的康耐视销售代表联系,了解如何获取许可证密钥,包括可用于30天评估SDK的试用许可证。
在获得许可密钥后,在应用程序的AndroidManifest.xml文件中添加以下一行,在application标签下:
接下来,将您的密钥放在YOUR_MX_MOBILE_LICENSE的位置。
以前的SDK版本通过直接USB设备或USB附件连接访问MX移动终端。这些方法现在已弃用,您应该使用MXConnect应用程序连接到MX移动终端。(见步骤4.)
cmbSDK提供了一个简单的工厂方法DataManSystem. createdatamansystemformxdevice(),用于通过MXConnect应用程序为MX移动终端创建一个DataManSystem。
请从你的项目中删除任何DataManSystem.createDataManSystemOverUsb()和DataManSystem.createDataManSystemOverUsbAccessory()方法,并从AndroidManifest.xml文件中删除USB_ DEVICE-ATTACHED和USB_ACCESSORY_ATTACHED Intent过滤器和元数据。
还可以从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.为了监视阅读器的连接状态并接收有关已读代码的信息,必须使用以下接口:
公共类ScannerActivity扩展了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 () > 0) {ReadResult result = results. getresultat (0);//使用字符串符号名;字符串的代码;位图框架;if (result.isGoodRead()) {String symbolologyname;字符串代码= result.getReadString();symbol = 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对象:
boolean listeningForUSB = false;ScannerActivity。readerDevice = readerDevice . getmxdevice (ScannerActivity.this);if (!listeningForUSB) {readerDevice.startAvailabilityListening();listeningForUSB = true;}
MX移动终端的可用性可以在设备打开或关闭,或者连接或断开USB线时发生变化。可以使用以下ReaderDeviceListener接口方法处理这些更改上述第三步):
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参数中。
方法检查此异常类型运算符operator和请求活动中的权限。
if (error instanceof CameraPermissionException) ActivityCompat.requestPermissions(((ScannerActivity) this), new String[]{Manifest.permission. permission. exception)相机},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. int) {长度> 0 && grantResults[0] == packagemanager . permission_granting) {if (readerDevice != null && readerDevice. getconnectionstate () != ConnectionState.Connected) readerDevice.connect(ScannerActivity.this);} else {if (ActivityCompat.shouldShowRequestPermissionRationale((ScannerActivity) this), Manifest.permission.CAMERA)) {AlertDialog。生成器生成器=新的AlertDialog.Builder(this) . setmessage("你需要允许访问相机"). setpositivebutton ("OK",新的DialogInterface. onclicklistener(){@覆盖公共无效onClick(DialogInterface DialogInterface, int i) {activitycompat.com requestpermissions(扫描活动。this, new String[]{Manifest.permission。相机},REQUEST_PERMISSION_CODE);}}) .setNegativeButton("取消",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对象。
onConnectionStateChanged(ReaderDevice reader);公共无效onConnectionCompleted(ReaderDevice reader, Throwable err
激活扫描
readerDevice.startScanning ();
您可以使用以下命令停止扫描:
readerDevice.stopScanning ();
onReadResultReceived侦听器方法(参见步骤3)将在条形码被解码时调用
阅读器,或扫描过程已完成。
连接到扫描设备后,您可能希望(或需要)更改其某些设置。cmbSDK提供了一组高级的、独立于设备的api,用于设置和检索设备的当前配置。
与初始化读取设备的情况一样,使用MX读取器和使用相机读取器进行扫描之间存在一些区别。下面几节将详细介绍这些差异。
MX系列移动终端提供了复杂的设备配置和管理,包括保存在设备本身上的配置。一般来说,这些设备来自康耐视,预配置为一个特殊的开箱即用的体验,大多数符号和功能准备使用。
当需要自定义重新配置时,通常使用DataMan Setup Tool或DataMan Quick Setup完成,因为这些工具可用于将保存的配置轻松分发到多个设备,从而大大简化配置管理。
然而,它仍然是可能的(有时是可取的)移动应用程序本身配置MX设备:
与MX移动终端非常相似,cmbSDK使用移动设备的内置摄像头进行条形码读取的默认选项集,提供了良好的开箱即用体验。然而,有两个重要的区别需要记住:
cmbSDK不启用任何功能象征学默认情况下:作为应用程序程序员,您必须启用应用程序需要扫描的所有条形码符号。通过要求应用程序显式地只启用它需要的符号,可以实现最优的扫描性能。这一概念在概述部分。
可以使用Reader Device对象的以下方法启用单个符号:
readerDevice.setSymbologyEnabled(最终的符号学符号学,最终布尔启用,最终的OnSymbologyListener监听器)DATAMATRIX, true, null);readerDevice.setSymbologyEnabled(象征。UPC_EAN, true, null);
此方法中用于符号参数的所有符号都可以在ReaderDevice.java.
例子
/*启用二维码扫描*/ readerDevice.setSymbologyEnabled(符号。QR, true, null);
同样的方法也可以用来关闭符号:
/ *禁用Code 25扫描*/ readerDevice.setSymbologyEnabled(符号。C25, false, null);
你可以实现OnSymbologiesListener的方法:
@Override public void onSymbologyEnabled(ReaderDevice reader, symsymology symbolology, Boolean enabled, Throwable error) {if (error != null){/*不成功可能是当前设备不支持符号,或者ReaderDevice和MX设备之间的连接有问题*/}否则{// Success}}
cmbSDK包括一个将设备重置为默认设置的方法。在MX移动终端的情况下,这是默认保存的配置(不是出厂默认值),而在内置摄像头的情况下,这些是在附录B,其中不启用任何符号。方法如下:
readerDevice.resetConfig(空);
作为一个异步方法,你可以通过将OnResetConfigListener接口作为可选参数传递给该方法来监视它的完成情况。
公共类ScannerActivity扩展了Activity,实现了....OnResetConfigListener……{…@Override public void onResetConfigCompleted(ReaderDevice reader, Throwable error) {if (error != null){//不成功}else {// Success}}
如果您的阅读设备配备了照明灯(例如led),您可以在扫描开始时使用阅读设备对象的以下方法控制它们是打开还是关闭:
readerDevice。setLightsOn(真的,null);
您还可以为OnLightsListener实现接口方法,这是该方法的第二个参数。
公共类ScannerActivity扩展了Activity,实现了....OnLightsListener……{…@覆盖公共无效onLightsOnCompleted(ReaderDevice reader, Boolean on, Throwable error) {if (error != null){//不成功}else {// Success}}}}
请记住,并非cmbSDK支持的所有设备和设备模式都允许照明控制。例如,如果使用内置相机在被动瞄准模式,照明是不可用的,因为LED是用于瞄准。
每个康耐视扫描设备都实现了DataMan控制命令(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 () > 0) {ReadResult结果= results. getresultat (0);//使用字符串符号名;字符串的代码;位图框架;if (result.isGoodRead()) {String symbolologyname;字符串代码= result.getReadString();symbol = result.getSymbology();if (symbolology != null) {symbologyName = symbolology . getname ();tvSymbology.setText (symbologyName);} else {tvsymology。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属性。字节被存储为“full_string”标签下的Base64字符串。下面是如何使用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. xml)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 |
On | off |
打开/关闭代码11检查数字。 |
X |
获取/设置 |
C11。CHKCHAR-OPTION |
1 2 |
需要单个校验和。需要双重校验和。 |
X |
获取/设置 |
C11。CODESIZE |
ON min max OFF min max |
接受任何长度代码11。 |
X |
获取/设置 |
这件。CODESIZE |
ON min max OFF min max |
接受任何长度代码25。 |
X |
获取/设置 |
C39。美国信息交换标准代码 |
On | off |
打开/关闭Code 39扩展ASCII。 |
|
获取/设置 |
C39。CODESIZE |
ON min max OFF min max |
接受任何长度代码39。 |
|
获取/设置 |
C39。CHKCHAR |
On | off |
打开/关闭代码39检查数字 |
|
获取/设置 |
C93。美国信息交换标准代码 |
On | off |
打开/关闭代码93扩展ASCII |
X |
获取/设置 |
C93。CODESIZE |
ON min max OFF min max |
接受任何长度代码93。 |
|
配置。默认的 |
将大多数相机API设置重置为默认值,除了那些未重置的设置(见附录B)。要重置所有设置,请使用DEVICE.DEFAULT。 |
|||
获取/设置 |
数据。结果类型 |
0 1 2 4 8 |
指定要返回的结果(多个值的和):无 XML数据 |
|
获取/设置 |
DATABAR。扩大 |
On | off |
打开/关闭数据库扩展符号。 |
|
获取/设置 |
DATABAR。有限的 |
On | off |
打开/关闭DataBar Limited符号。 |
|
获取/设置 |
DATABAR。RSS14 |
On | off |
打开/关闭DataBar RSS14符号。 |
X |
获取/设置 |
DATABAR。RSS14STACK |
On | off |
打开/关闭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 |
On | off |
将交错的5个检查数字中的2个打开/关闭。 |
|
获取/设置 |
I205。CODESIZE |
ON min max OFF min max |
接受任意长度交错2 / 5。 |
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 |
瞄准手的超时时间(秒)。 |
|
获取/设置 |
光。内部,使 |
On | off |
启用/禁用照明(当扫描仪启动时)。 |
|
获取/设置 |
MSI。CHKCHAR |
On | off |
打开/关闭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 |
On | off |
打开/关闭阿兹特克代码符号。 |
|
获取/设置 |
的象征。CODABAR |
On | off |
打开/关闭Codabar符号。 |
|
获取/设置 |
的象征。C11 |
On | off |
打开/关闭代码11符号。 |
X |
获取/设置 |
的象征。C128 |
On | off |
打开/关闭代码128符号。 |
获取/设置 |
命令 |
参数(年代) |
描述 |
|
获取/设置 |
的象征。这件 |
On | off |
打开/关闭Code 25符号(标准)。 |
|
获取/设置 |
的象征。C39 |
On | off |
打开/关闭Code 39符号。 |
|
获取/设置 |
的象征。C93 |
On | off |
打开/关闭代码93符号。 |
|
获取/设置 |
的象征。鸡笼 |
On | off |
打开/关闭COOP符号(代码25变体)。 |
X |
获取/设置 |
的象征。DATAMATRIX |
On | off |
打开/关闭数据矩阵符号。 |
|
获取/设置 |
的象征。DATABAR |
On | off |
打开/关闭数据库扩展和限制符号。 |
|
获取/设置 |
的象征。DOTCODE |
On | off |
打开/关闭DotCode符号。 |
|
获取/设置 |
的象征。国际航空运输协会 |
On | off |
打开/关闭IATA符号(代码25变体)。 |
X |
获取/设置 |
的象征。倒 |
On | off |
打开/关闭反转符号(代码25变体)。 |
X |
获取/设置 |
的象征。ITF14 |
On | off |
打开/关闭ITF-14符号(代码25变体)。 |
X |
获取/设置 |
的象征。UPC-EAN |
On | off |
开启/关闭UPC-A、UPC-E、EAN-8和EAN-13符号。 |
|
获取/设置 |
的象征。矩阵 |
On | off |
打开/关闭矩阵符号(代码25变体)。 |
X |
获取/设置 |
的象征。MAXICODE |
On | off |
打开/关闭MaxiCode符号。 |
X |
获取/设置 |
的象征。MSI |
On | off |
打开/关闭MSI Plessey符号。 |
|
获取/设置 |
的象征。PDF417 |
On | off |
打开/关闭PDF417符号。 |
|
获取/设置 |
的象征。地球 |
On | off |
打开/关闭PLANET符号。 |
|
获取/设置 |
的象征。POSTNET |
On | off |
打开/关闭POSTNET符号。 |
|
获取/设置 |
SYMBOL.4STATE-IMB |
On | off |
打开/关闭智能邮件条形码符号。 |
|
获取/设置 |
SYMBOL.4STATE-RMC |
On | off |
打开/关闭皇家邮政编码符号。 |
|
获取/设置 |
的象征。QR |
On | off |
打开/关闭QR和MicroQR符号。 |
|
获取/设置 |
触发器。类型 |
0 1 2 3 4 5 |
不支持不支持手动(默认)不支持不支持连续 |
|
获取/设置 |
UPC-EAN。EAN13 |
On | off |
打开/关闭EAN-13符号。 |
X |
获取/设置 |
UPC-EAN。EAN8 |
On | off |
打开/关闭EAN-8符号。 |
X |
获取/设置 |
UPC-EAN。UPC-A |
On | off |
打开/关闭UPC-A符号。 |
X |
获取/设置 |
UPC-EAN。UPC-E |
On | off |
打开/关闭UPC-E符号。 |
X |
获取/设置 |
UPC-EAN。UPCE1 |
On | off |
打开/关闭UPC-E1符号。 |
|
获取/设置 |
UPCE——一个。补充 |
0 1 - 4 |
关闭UPC补充代码。打开UPC补充代码。 |
下表列出了SDK在相机读取器启动时使用的默认值。
设置 |
默认值 |
只复位设备? |
---|---|---|
哔哔的声音。好 |
11 1(打开哔声) |
|
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的后六位数字。序列号 |
|
象征学(象征。*) |
关闭(所有符号都被禁用) |
|
符号子类型(组):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 |
在安装康耐视产品时,请遵守以下注意事项,以减少人身伤害或设备损坏的风险: