Android的源代码是由谷歌在开源许可下发布的,尽管大多数Android设备最终附带了免费、开源和专有软件的组合,包括访问谷歌服务所需的专有软件。
应用程序是写使用的安卓软件发展工具包(SDK)而且,通常,的Java编程语言。Java五月是结合与C / c++在一起与一个选择的非默认运行时那允许更好的c++支持。的芬兰湾的科特林和围棋编程语言是也支持,后者与一个有限的集的应用程序编程接口(API)。
的SDK包括全面的集的发展工具,包括一个调试器,软件库,手机模拟器基于在QEMU,文档,样本代码,而且教程。Android工作室,基于在IntelliJ的想法,是主要集成发展环境(IDE)为Android应用程序开发。其他发展工具都是可用的,包括一个本地的发展工具包(NDK),用于C或c++中的应用程序或扩展,谷歌App Inventor,一个面向新手程序员的可视化环境,以及各种跨平台移动web应用程序框架。还有一个基于Apache Cordova的框架,用于将ChromeHTML 5 web应用程序移植到Android,封装在原生应用程序外壳中。
的康耐视移动条码SDK(cmbSDK)是开发移动条码扫描应用程序的一个简单但功能强大的工具。基于康耐视的旗舰DataMan技术和Manatee Works条形码扫描SDK, cmbSDK允许开发人员为整个移动扫描设备范围创建条形码扫描应用程序:从智能手机和平板电脑到MX系列的高性能工业条形码扫描仪。通过遵循一些简单的指导原则,开发人员可以编写能够在任何受支持的MX移动终端或智能手机上工作的应用程序,只需很少或没有条件代码。SDK通过“读取器”连接层抽象设备来实现这一点:一旦应用程序与所需的读取器建立连接,就使用一个单一的、统一的API来配置设备并与设备连接。
SDK提供了两个基本阅读器:一个“MX阅读器”,用于使用MX-1000和MX-1502等设备进行条形码扫描,另一个“摄像头阅读器”,用于使用移动设备的内置摄像头进行条形码扫描。
本文件中描述的软件是在许可下提供的,只能按照该许可条款使用或复制,并包含本页所示的版权声明。除被许可人以外,软件、本文件及其任何副本均不得提供给或以其他方式提供给任何人。本软件的所有权和所有权仍属于康耐视公司或其许可方。康耐视公司不对其软件在非康耐视公司提供的设备上的使用或可靠性承担任何责任。康耐视公司对所述软件、其适销性、非侵权性或其适用于任何特定目的不作任何明示或暗示的保证。
本文件中的信息可随时更改而不另行通知,不应被视为康耐视公司的承诺。康耐视公司不对本文档或相关软件中可能出现的任何错误负责。
除非另有说明,本文示例中使用的公司、名称和数据均为虚构。未经康耐视公司书面许可,本文件的任何部分不得以任何形式或方式(电子或机械)为任何目的复制或传播,或转移到任何其他媒体或语言。
版权所有©2017。Cognex公司。版权所有
康耐视提供的部分硬件和软件可能包含一项或多项美国和外国专利,以及列在康耐视网站上的未决美国和外国专利://m.czl106.com/patents.
以下为康耐视公司注册商标:
Cognex, 2DMAX, Advantage, AlignPlus, Assemblyplus, Check it with 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
以下是康耐视公司的商标:
Cognex标志,1DMax, 3D-Locate, 3DMax, BGAII, CheckPoint, Cognex VSoC, CVC-1000, FFD, iLearn, In-Sight(设计徽章与十字线),In-Sight 2000, InspectEdge,检查设计师,MVS, NotchMax, OCRMax, PatMax RedLine,校对,SmartSync, ProfilePlus, SmartDisplay, SmartSystem, SMD4, VisiFlex, Xpand
在此识别的其他产品和公司商标是其各自所有者的商标。
SDK支持Cognex的MX移动终端系列,包括MX-1000和MX-1502设备。您可以在康耐视的官方网站(//m.czl106.com).它们关于cmbSDK使用的一些特性如下:
MX平台的以下特性结合了以下特性,使应用程序开发更加简单:
设置的简易性: MX移动终端预先配置,以提供一个伟大的开箱即用的体验。MX移动终端保存了配置,可以分发到您的所有设备。在应用程序级别通常不需要设置。但是,建议在条码扫描应用程序启动时将设备置于“已知”状态,因此cmbSDK提供了恢复设备默认值以及控制个别设置的方法。
MX移动终端通过USB或闪电端口连接到您的设备。这意味着该端口在应用程序运行时被占用,但是还有其他方法可以调试应用程序,例如通过Wi-Fi。
在Android上调试:
要使用Android Studio、Eclipse、Xamarin或任何其他可以运行Android应用程序的程序进行调试,请通过USB连接您的Android设备,并确保可以使用USB电缆运行和调试您的应用程序。为了不使用USB线连接设备,从Android工具中打开Android调试桥(adb)。
警告:不建议开启无线调试选项,因为网络中的任何人都可以在调试中连接到您的设备,即使您是在数据网络中。只有当你连接到一个受信任的Wi-Fi时才这样做,并且不要忘记在连接完成后断开连接(参见步骤5)。
重要的是要认识到,作为条形码扫描设备,智能手机和平板电脑的功能有几个根本性的区别。这些差异导致用户体验与专用扫描仪不同,影响了移动条形码扫描应用程序的设计。
这些差异及其对应用程序的一般影响如下:
cmbSDK使这些差异对应用程序开发人员和用户尽可能透明。通过遵循一些简单的指导方针,您可以开发在使用MX-1000移动终端或仅使用设备的内置摄像头时工作和行为相同的应用程序。
在没有硬件触发的情况下,移动设备必须使用其他方法启动条形码扫描。常用的方法有三种:
cmbSDK支持所有三种方法,其中任何一种(或多种)都可以在应用程序中使用。
与专用扫描仪不同,移动设备没有内置瞄准器。条码瞄准通常是通过提供来自移动设备显示屏上的摄像头的实时预览来实现的。然后,用户可以重新定位设备,直到条码出现在视野中并被解码。
cmbSDK通过提供一个内置的预览控件简化了这一任务,该控件可以显示全屏、部分屏幕以及纵向或横向。
cmbSDK还支持“无源”瞄准器:附加到移动设备或其外壳上的设备,使用设备的LED闪光作为光源来投射瞄准或瞄准模式。这些瞄准器的优点是不再需要屏幕预览,因为移动设备可以投影瞄准器模式类似于专门建造的扫描仪。然而,注意使用LED闪光灯进行一般扫描照明是不可用的,因为移动设备闪光灯用于瞄准器。
移动设备支持开发纵向、横向或两者之间自动旋转的应用程序。cmbSDK完全支持条码预览的表示和扫描方向的所有三个选项。无论应用程序和/或移动设备的朝向如何,大多数条形码都可以通过移动设备扫描。
对于扫描“正方形”条形码,如二维码,数据矩阵,和MaxiCode,任何方向都可以使用。然而,对于扫描长或密集的条形码,如大型PDF417,建议使用横向,甚至是必要的。在竖屏模式下,移动相机沿图像的“高度”有较高的分辨率。例如,1280x720是常用的分辨率。这意味着使用纵向扫描条形码沿水平轴提供720像素的数据,而横向扫描在水平扫描线上提供1280像素的条形码解码。
随着多核cpu和专用图像处理器的出现,如今的手持设备具有强大的计算能力,为高效、经济的条形码解码提供了理想的平台。仍然建议开发人员优化他们的条形码扫描应用程序。cmbSDK专门针对移动环境进行了优化,但图像分析和条形码解码仍然是一个CPU密集型活动。由于这些进程与操作系统、服务和其他应用程序共享移动设备的CPU,因此建议开发人员限制他们的应用程序只使用他们需要的SDK特性。
应用程序优化包括以下内容:
由于这些原因,当初始化cmbSDK以与移动设备的内置摄像头一起使用时,默认情况下没有启用任何条形码符号,应用程序必须只启用它需要的符号。由于大多数条形码扫描应用程序只需要扫描少量符号,这种行为鼓励开发人员以高效的方式使用SDK。
安装Android cmbSDK的步骤如下:
如果您计划使用cmbSDK在智能手机或平板电脑(没有MX移动终端)上进行移动扫描,那么SDK需要安装许可密钥。没有许可密钥,SDK仍将运行,尽管扫描结果将被混淆(SDK将随机地用星号字符替换扫描结果中的字符)。
与您的康耐视销售代表联系,了解如何获取许可密钥,包括可用于30天评估SDK的试用许可证。
获得许可密钥后,在应用程序的AndroidManifest.xml文件中,在应用程序标签下添加以下行:
接下来,将密钥放在YOUR_MX_MOBILE_LICENSE的位置。
<应用android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
第二种添加许可密钥的方法如下例所示:
// init connection to Phone Camera case 1: readerDevice = readerDevice。getPhoneCameraDevice (CameraMode。NO_AIMER PreviewOption。违约, rlPreviewContainer,"SDK_KEY");
以前的SDK版本通过直接USB Device或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);//使用字符串symbolyname;字符串的代码;位图框架;if (result.isGoodRead()){字符串symbolyname;字符串代码= result.getReadString();symbol = result. getsymbolology ();if (symbolology != null) {symbolologyname = symbolic . 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 phone、Android平板电脑等)。
使用以下工厂方法为MX阅读器初始化一个Reader Device对象:
boolean listeningForUSB = false;ScannerActivity。readerDevice = readerDevice . getmxdevice (ScannerActivity.this);if (!listeningForUSB) {readerDevice.startAvailabilityListening();listeningForUSB = true;}
MX移动终端的可用性可以在设备打开或关闭,或者USB线连接或断开时发生变化。您可以使用下面的ReaderDeviceListener接口方法(在以上步骤3):
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 = readerDevice。getPhoneCameraDevice (ScannerActivity。这个,CameraMode。NO_AIMER, PreviewOption.NO_ZOOM_BUTTON | PreviewOption.PAUSED, rlPreviewContainer);
这将启动预览与扫描仪暂停和一个软触发按钮切换扫描。按下软触发按钮后,rlPreviewContainer应该是这样的:
上图中的取景器有一个主动扫描表面,这是设置了主动符号的结果。有关此主题的更多详细信息,请参见配置阅读器).
从Android 6.0和以上版本,您需要从用户请求访问手机摄像头的权限。
如果由于权限问题无法打开手机摄像头onConnectionCompleted (readerDevice错误)回调函数包含CameraPermissionException在error参数中。
方法检查此异常类型运算符操作,并在活动中请求权限。
if (error instanceof CameraPermissionException) ActivityCompat.requestPermissions(((ScannerActivity) this), new String[]{Manifest.permission. permission. if (error instanceof CameraPermissionException) ActivityCompat.requestPermissions(((ScannerActivity) this), new String[]{{相机},REQUEST_PERMISSION_CODE);
请注意,您需要实现ActivityCompat。OnRequestPermissionResultCallback接口来捕获用户权限结果。
处理用户响应onRequestPermissionResult(…),您可以使用以下代码重试连接到PhoneCamera。
@覆盖公共无效onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {if (requestCode == REQUEST_PERMISSION_CODE) {if (grantResults. permission . permission . permission . permission . permission . permission . permission . permission。长度> 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {if (readerDevice != null && readerDevice. getconnectionstate () != ConnectionState.Connected) readerDevice.connect(ScannerActivity.this);} else {if (ActivityCompat.shouldShowRequestPermissionRationale(((ScannerActivity) this), Manifest.permission.CAMERA)){警报对话框。构建器构建器= new AlertDialog.Builder(this) . setmessage("你需要允许访问摄像头"). setpositivebutton ("OK", new DialogInterface. onclicklistener(){@覆盖公共无效onClick(DialogInterface DialogInterface, int i) {ActivityCompat.requestPermissions(ScannerActivity。this, new String[]{Manifest.permission。相机},REQUEST_PERMISSION_CODE);}}) .setNegativeButton("Cancel", null);AlertDialog dialog = builder.create();dialog.show ();} } } }
在连接之前,设置ReaderDeviceListener对象来接收事件:
readerDevice.setReaderDeviceListener (ScannerActivity.this);
看到步骤3获取详细信息。
此外,您还可以启用从阅读器发送最后触发的图像和SVG:
readerDevice.enableImage(真正的);readerDevice.enableImageGraphics(真正的);
在初始化ReaderDevice并设置一个监听器方法来处理来自阅读器的响应之后,可以调用connect方法,它接受OnConnectionCompletedListener(参见步骤3有关详情)作为参数:
//确认设备已打开并准备好readerDevice.connect(ScannerActivity.this);
如果一切都正确完成,则使用新的ReaderDevice状态信息调用以下侦听器方法。onConnectionCompleted方法(作为connect的参数传递)也在连接过程完成时被调用,如果存在连接错误,则提供一个Throwable对象。
onConnectionStateChanged(ReaderDevice reader);ReaderDevice阅读器,可抛出错误
激活扫描
readerDevice.startScanning ();
您可以停止扫描以下功能:
readerDevice.stopScanning ();
onReadResultReceived侦听器方法(参见步骤3)在读取器已解码条码或扫描过程已完成时调用。
连接到扫描设备后,您可能想(或需要)更改其某些设置。cmbSDK提供了一组高级的、设备独立的api,用于设置和检索设备的当前配置。
与初始化阅读器设备的情况一样,使用MX阅读器和用于扫描的相机阅读器之间也有一些区别。这些差异将在下面的小节中详细说明。
MX移动终端系列提供了复杂的设备配置和管理,包括设备本身保存的配置。一般来说,这些设备来自Cognex,预先配置,以提供特殊的开箱即用的体验,大多数符号和功能都可以使用。
当需要自定义重新配置时,通常使用DataMan Setup Tool或Cognex 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);
同样的方法也可以用来关闭符号:
/ *禁用代码25扫描*/ readerDevice.setSymbologyEnabled(符号。C25, false, null);
你可以实现OnSymbologiesListener的方法:
@Override public void onsymbolologyenabled (ReaderDevice reader, symbolology symbolic, Boolean enabled, Throwable error) {if (error != null){/*不成功可能是当前设备不支持符号,或者ReaderDevice和MX设备之间的连接有问题*/}else {// Success}}
如果您的阅读器设备配备了照明灯(例如led),您可以使用您的阅读器设备对象的以下方法在扫描开始时控制它们是ON还是OFF:
readerDevice。setLightsOn(true, null);
可选地,您可以实现OnLightsListener的接口方法,这是该方法的第二个参数。
公共类ScannerActivity扩展Activity实现....OnLightsListener……{…@覆盖公共无效onLightsOnCompleted(ReaderDevice reader, Boolean on, Throwable error) {if (error != null){//不成功}else{//成功}}}
请记住,并非cmbSDK支持的所有设备和设备模式都允许照明控制。例如,如果使用内置相机在被动瞄准模式,照明是不可用的,因为LED被用于瞄准。
如果使用内置摄像头作为阅读器,则可以配置缩放级别并定义使用这些缩放级别的方式。
手机相机有3个变焦级别,分别是:
你可以用“SET CAMERA”来定义这些缩放级别。ZOOM-PERCENT [100-MAX] [100-MAX]命令。它配置两个级别按百分比放大的距离。100是不变焦的,MAX(最高可达1000)将在设备的能力范围内放大。第一个参数用于设置级别1的缩放,第二个用于级别2的缩放。
当你想检查当前设置,你可以用“GET CAMERA”来完成。它返回两个值:第1级和第2级缩放。
例子
readerDevice.getDataManSystem()。sendCommand(“设置相机。缩放比例250 500”);
还有另一个命令可以设置你想要使用的缩放级别或返回实际的设置:“GET/SET CAMERA。变焦0 - 2”。
SET命令可能的值有:
您可以在扫描之前甚至扫描期间调用此命令,缩放将上升到所配置的级别。
如果扫描完成,则值重置为正常行为(0)。
例子
readerDevice.getDataManSystem()。sendCommand(“设置相机。放大2”);
cmbSDK包含一个将设备重置为默认设置的方法。在MX移动终端的情况下,这是默认保存的配置(不是出厂默认值),而在内置摄像头的情况下,这些是在附录B,其中将不启用任何符号。该方法如下:
readerDevice.resetConfig(空);
作为一个异步方法,您可以使用作为可选参数传递给方法的OnResetConfigListener接口来监视它的完成。
公共类ScannerActivity扩展Activity实现....OnResetConfigListener……{…@覆盖公共无效onResetConfigCompleted(ReaderDevice阅读器,可抛出错误){if(错误!= null){//不成功}else{//成功}}
每个Cognex扫描设备都实现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(); } } ); }
当使用移动相机时,cmbSDK允许您在预览容器中或全屏查看相机预览。这个预览也包含一个覆盖,可以自定义的方式很多。cmbSDK摄像头覆盖由用于缩放、闪光和关闭扫描仪(全屏)的按钮、指示扫描超时的进度条和摄像头预览角上的线条组成。
使用cmbSDK v2.0中使用的传统相机覆盖层。x而且的ManateeWorks SDK, use this property from MWOverlay before initializing the readerDevice:
MWOverlay。overlayMode = mwoverlaymode . om_legacy;
传统覆盖层的可定制性有限,所以首选使用CMB覆盖层。
当使用CMB覆盖时,您可以将Resources/layout目录中的布局文件复制到您的项目中,并根据您的需要修改它们。必威随行版官网这些文件是:cmb_scanner_partial_view.xml当扫描程序在容器内启动时使用(部分视图)和cmb_scanner_view.xml当扫描仪全屏启动时。
在复制你需要的布局(或两个布局)后,你可以修改它们,例如通过改变视图的大小、位置或颜色,删除视图,甚至添加你自己的视图,如覆盖图像。cmbSDK使用的视图(缩放、闪光、关闭按钮、用于在角上画线的视图和进度条)由sdk使用android:标签属性,因此如果您可以更改那些视图的所有内容,请确保android:标签属性保持不变,否则cmbSDK将无法识别这些视图并继续工作,就好像这些视图被删除了一样。
CMB和LEGACY覆盖都允许你改变缩放和闪光按钮上使用的图像。为此,您所需要做的就是确保您的映像具有与cmbSDK使用的映像相同的名称。您可以在参考资料/中找到sdk中使用的图像和名称必威随行版官网drawable-mdpi而且drawable-hdpi目录。虽然其他分辨率是可选的,但这两个分辨率必须包含具有正确名称的图像,这样cmbSDK才会显示正确的图像。
CMB和LEGACY覆盖层都允许您更改检测到条形码时显示的矩形的颜色和宽度。下面是一个如何做到这一点的例子:
MWOverlay。locationLineColor = Color.YELLOW;MWOverlay。locationLineWidth = 6;
有了正确配置的阅读器,现在就可以扫描条形码了。这可以通过从Reader Device对象调用startScanning方法来实现。
接下来会发生什么取决于阅读器设备的类型和它的配置方式,但一般来说:
在下列情况之一时停止扫描:
当条形码被成功解码时(第一种情况),您将在ReaderDevice侦听器方法中收到一个ReadResults可迭代结果集合对象,该对象已经在步骤3.
@覆盖公共无效onReadResultReceived(ReaderDevice reader, ReadResults results) {if (results. getcount () > 0) {ReadResult result = results. getresultat (0);//使用字符串symbolyname;字符串的代码;位图框架;if (result.isGoodRead()){字符串symbolyname;字符串代码= result.getReadString();symbol = result. getsymbolology ();if (symbolology != null) {symbolologyname = symbolic . getname ();tvSymbology.setText (symbologyName);} else {tvsymbolology .}集Text("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类具有描述条形码读取结果的属性:
当扫描结束而没有成功读取时,将触发ReadResult返回的值与goodRead属性设置为false。这通常发生在扫描被取消或超时时。
控件中填充的image和imageGraphics属性ReadResult对象,您必须设置相应的enableImage ()和/或enableImageGraphics ()ReaderDevice对象的属性。
要查看如何使用和并行显示图像和SVG图形的示例,请参考SDK包中提供的示例应用程序。
并非所有受支持的设备都提供SVG图形。
要从扫描的条形码访问原始字节,可以使用XML属性。字节以Base64字符串的形式存储在"full_string"标记下。下面是如何使用XML解析器从XML属性中提取原始字节的示例。
try {XmlPullParserFactory工厂= XmlPullParserFactory. newinstance ();factory.setNamespaceAware(真正的);XmlPullParser xpp = factory.newPullParser();字符串标签= "";//原始字节将存储在这个变量byte[] bytes中;xpp。集Input(new 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打开蜂鸣声。 |
|
获取/设置 | 相机。变焦 | 0 - 2 | SET命令的可能值是:0 - normal (unzoomed), 1 -zoom在级别1,2 -zoom在级别2。此缩放级别在扫描期间使用。当扫描结束时,它重置为0。 |
x |
获取/设置 | 相机。变焦-PERCENT | [100 - max] [100 - max) | 设置/返回1级缩放(Android默认150%,iOS默认200%),以及2级缩放(Android默认300%,iOS默认400%)。 注意:相机需要从sdk启动至少一次,以有一个合适的最大变焦(max)值。 |
x |
获取/设置 |
CODABAR。CODESIZE |
ON min max OFF min max |
接受任何长度的Codabar。 |
X |
获取/设置 |
C11。CHKCHAR |
关| |
打开/关闭代码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。美国信息交换标准代码 |
关| |
打开/关闭Code 39扩展ASCII码。 |
|
获取/设置 |
C39。CODESIZE |
ON min max OFF min max |
接受任何长度的代码39。 |
|
获取/设置 |
C39。CHKCHAR |
关| |
打开/关闭代码39检查数字 |
|
获取/设置 |
C93。美国信息交换标准代码 |
关| |
打开/关闭代码93扩展ASCII |
X |
获取/设置 |
C93。CODESIZE |
ON min max OFF min max |
接受任何长度的代码93。 |
|
配置。默认的 |
将大多数相机API设置重置为默认值,除了那些没有重置的设置(参见附录B)。要重置所有设置,请使用DEVICE.DEFAULT。 |
|||
获取/设置 |
数据。结果类型 |
0 1 2 4 8 |
指定要返回的结果(多个值的和):无 XML数据 |
|
获取/设置 |
DATABAR。扩大 |
关| |
打开/关闭数据扩充符号。 |
|
获取/设置 |
DATABAR。有限的 |
关| |
打开/关闭DataBar Limited符号。 |
|
获取/设置 |
DATABAR。RSS14 |
关| |
打开/关闭DataBar RSS14符号。 |
X |
获取/设置 |
DATABAR。RSS14STACK |
关| |
打开/关闭DataBar RSS14堆叠符号。 |
X |
获取/设置 |
DECODER.1D——SYMBOLORIENTATION |
0 1 2 3 |
采用全向扫描定向。 |
|
获取/设置 |
译码器。努力 |
1 - 5 |
设置图像分析/解码的工作级别。默认值为2。不要使用4-5进行在线扫描。 |
X |
获取/设置 |
译码器。MAX-SCAN——超时 |
1 - 120 |
设置直播预览的超时时间。当超时到达时,解码暂停;直播预告将继续显示在屏幕上。 |
X |
得到 | 译码器。MAX-THREADS | 返回设备支持的最大CPU线程数。 | X | |
获取/设置 | 译码器。线色 | (0-MAX) | 指定扫描程序在扫描过程中可以使用的最大CPU线程数。 | X |
设备。默认的 |
重置相机API设置为默认值(参见附录B)。 |
|||
得到 |
设备。FIRMWARE-VER |
获取设备固件版本。 |
||
得到 |
设备。ID |
返回由Cognex分配给扫描设备的设备ID。 对于内置摄像头,SDK返回53。 |
||
获取/设置 |
设备。的名字 |
返回分配给设备的名称。默认情况下,这是“MX-”加上DEVICE.SERIAL-NUMBER的后6位。 |
||
得到 |
设备。串行-数 |
返回设备的序列号。对于内置摄像头,SDK分配一个伪随机数。 |
||
得到 |
设备。类型 |
返回由Cognex分配给扫描设备的设备名称。对于内置摄像头,SDK返回“MX-Mobile”。 |
||
获取/设置 |
的焦点。FOCUSTIME |
清廉 |
设置相机的自动对焦周期(相机应该尝试重新对焦的频率)。默认值为3。 |
|
获取/设置 |
I2O5。CHKCHAR |
关| |
交替打开/关闭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 |
禁用/启用瞄准器(当扫描仪启动时)。 |
|
获取/设置 |
光。内部,使 |
关| |
启用/禁用照明(当扫描仪启动时)。 |
|
获取/设置 |
MSI。CHKCHAR |
关| |
打开/关闭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 |
关| |
打开/关闭阿兹特克代码符号。 |
|
获取/设置 |
的象征。CODABAR |
关| |
打开/关闭Codabar符号。 |
|
获取/设置 |
的象征。C11 |
关| |
打开/关闭代码11符号。 |
X |
获取/设置 |
的象征。C128 |
关| |
打开/关闭代码128符号。 |
|
获取/设置 |
的象征。这件 |
关| |
打开/关闭Code 25符号(标准)。 |
|
获取/设置 |
的象征。C39 |
关| |
打开/关闭代码39符号。 |
|
获取/设置 |
的象征。C93 |
关| |
打开/关闭代码93符号。 |
|
获取/设置 |
的象征。鸡笼 |
关| |
打开/关闭COOP符号(代码25变体)。 |
X |
获取/设置 |
的象征。DATAMATRIX |
关| |
打开/关闭数据矩阵符号。 |
|
获取/设置 |
的象征。DATABAR |
关| |
打开/关闭数据库扩展和有限符号。 |
|
获取/设置 |
的象征。DOTCODE |
关| |
打开/关闭DotCode符号。 |
|
获取/设置 |
的象征。国际航空运输协会 |
关| |
打开/关闭IATA符号(代码25变体)。 |
X |
获取/设置 |
的象征。倒 |
关| |
打开/关闭反向符号(代码25变体)。 |
X |
获取/设置 |
的象征。ITF14 |
关| |
打开/关闭ITF-14符号(代码25变体)。 |
X |
获取/设置 |
的象征。UPC-EAN |
关| |
打开/关闭UPC-A, UPC-E, EAN-8和EAN-13的符号。 |
|
获取/设置 |
的象征。矩阵 |
关| |
打开/关闭矩阵符号(代码25变体)。 |
X |
获取/设置 |
的象征。MAXICODE |
关| |
打开/关闭MaxiCode符号。 |
X |
获取/设置 |
的象征。MSI |
关| |
打开/关闭MSI Plessey符号。 |
|
获取/设置 |
的象征。PDF417 |
关| |
打开/关闭PDF417符号。 |
|
获取/设置 |
的象征。地球 |
关| |
打开/关闭PLANET符号。 |
|
获取/设置 |
的象征。POSTNET |
关| |
打开/关闭POSTNET符号。 |
|
获取/设置 |
SYMBOL.4STATE-IMB |
关| |
打开/关闭智能邮件条形码符号。 |
|
获取/设置 |
SYMBOL.4STATE-RMC |
关| |
打开/关闭皇家邮政编码符号。 |
|
获取/设置 |
的象征。QR |
关| |
打开/关闭QR和MicroQR符号。 |
|
获取/设置 |
触发器。类型 |
0 1 2 3 4 5 |
不支持不支持手动(默认)不支持不支持连续 |
|
获取/设置 |
UPC-EAN。EAN13 |
关| |
打开/关闭EAN-13符号。 |
X |
获取/设置 |
UPC-EAN。EAN8 |
关| |
打开/关闭EAN-8符号。 |
X |
获取/设置 |
UPC-EAN。UPC-A |
关| |
打开/关闭UPC-A符号。 |
X |
获取/设置 |
UPC-EAN。UPC-E |
关| |
打开/关闭UPC-E符号。 |
X |
获取/设置 |
UPC-EAN。UPCE1 |
关| |
打开/关闭UPC-E1符号。 |
|
获取/设置 |
UPC-EAN。补充 |
0 1 - 4 |
关闭UPC补充代码。打开UPC补充代码。 |
|
获取/设置 | 振动。好 | 关| | 设置/获取当读取代码时是否震动(默认是ON) |
下表列出了SDK在相机阅读器启动时使用的默认值。
设置 |
默认值 |
只重置设备? |
---|---|---|
哔哔的声音。好 |
1 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- AN.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 |
在安装康耐视产品时,请遵循以下注意事项,以减少人身伤害或设备损坏的风险: