Android's source code is released by Google under an open source license, although most Android devices ultimately ship with a combination of free and open source and proprietary software, including proprietary software required for accessing Google services.
Apps are written using the Android software development kit (SDK) and, often, the Java programming language. Java may be combined with C/C++ together with a choice of non-default runtimes that allow better C++ support. The Kotlin and Go programming languages are also supported, the latter with a limited set of application programming interfaces (API).
The SDK includes a comprehensive set of development tools, including a debugger, software libraries, a handset emulator based on QEMU, documentation, sample code, and tutorials. Android Studio, based on IntelliJ IDEA, is the primary integrated development environment (IDE) for Android application development. Other development tools are available, including a native development kit (NDK) for applications or extensions in C or C++, Google App Inventor, a visual environment for novice programmers, and various cross platform mobile web applications frameworks. There is also a framework based on Apache Cordova for porting ChromeHTML 5 web applications to Android, wrapped in a native application shell.
The Cognex Mobile Barcode SDK (cmbSDK) is a simple, yet powerful tool for developing mobile barcode scanning applications. Based on Cognex's flagship DataMan technology and the Manatee Works Barcode Scanning SDK, the cmbSDK allows developers to create barcode scanning applications for the entire range of mobile scanning devices: from smartphones and tablets to the MX line of high-performance, industrial barcode scanners. By adhering to a few simple guidelines, developers can write applications that will work with any supported MX mobile terminal or smartphone with little or no conditional code. The SDK achieves this by abstracting the device through a "reader" connection layer: once the application establishes its connection with the desired reader, a single, unified API is used to configure and interface with the device.
The SDK provides two basic readers: an “MX reader” for barcode scanning with devices like the MX-1000 and MX-1502, and a “camera reader” for barcode scanning using the built-in camera of the mobile device.
The software described in this document is furnished under license, and may be used or copied only in accordance with the terms of such license and with the inclusion of the copyright notice shown on this page. Neither the software, this document, nor any copies thereof may be provided to, or otherwise made available to, anyone other than the licensee. Title to, and ownership of, this software remains with Cognex Corporation or its licensor. Cognex Corporation assumes no responsibility for the use or reliability of its software on equipment that is not supplied by Cognex Corporation. Cognex Corporation makes no warranties, either express or implied, regarding the described software, its merchantability, non-infringement or its fitness for any particular purpose.
The information in this document is subject to change without notice and should not be construed as a commitment by Cognex Corporation. Cognex Corporation is not responsible for any errors that may be present in either this document or the associated software.
Companies, names, and data used in examples herein are fictitious unless otherwise noted. No part of this document may be reproduced or transmitted in any form or by any means, electronic or mechanical, for any purpose, nor transferred to any other media or language without the written permission of Cognex Corporation.
Copyright © 2017. Cognex Corporation. All Rights Reserved.
Portions of the hardware and software provided by Cognex may be covered by one or more U.S. and foreign patents, as well as pending U.S. and foreign patents listed on the Cognex web site at: https://www.cognex.com/patents.
The following are registered trademarks of Cognex Corporation:
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
The following are trademarks of Cognex Corporation:
The Cognex logo, 1DMax, 3D-Locate, 3DMax, BGAII, CheckPoint, Cognex VSoC, CVC-1000, FFD, iLearn, In-Sight (design insignia with cross-hairs), In-Sight 2000, InspectEdge, Inspection Designer, MVS, NotchMax, OCRMax, PatMax RedLine, ProofRead, SmartSync, ProfilePlus, SmartDisplay, SmartSystem, SMD4, VisiFlex, Xpand
Other product and company trademarks identified herein are the trademarks of their respective owners.
The SDK supports Cognex’s line of MX mobile terminals, including the MX-1000 and MX-1502 devices. You can get a detailed description of these devices at the official website of Cognex (https://www.cognex.com). Some of their features regarding cmbSDK usage are the following:
The following features of the MX platform combines the following features to make application development straightforward:
Ease of setup: MX mobile terminals come preconfigured to provide a great out-of-the-box experience. As MX mobile terminals have saved configurations that can be distributed to all your devices. setup is usually not necessary on application level. However, it is recommended to put the device in a “known” state when the barcode scanning application starts, so the cmbSDK provides methods to restore the device defaults as well as to control individual settings.
The MX Mobile Terminals connect to your device via USB or lightning port. This means that the port is occupied while your application is running, but there are other ways to debug your application, for example via Wi-Fi.
Debugging on Android:
To debug using Android Studio, Eclipse, Xamarin or any other program that can run Android applications, connect your Android device via USB and make sure you can run and debug your application using the USB cable. To have the device connected without using a USB cable, open Android Debug Bridge (adb) from the Android tools.
WARNING: Leaving the wireless debugging option enabled is not recommended, as anyone in your network can connect to your device in debug, even if you are in data network. Do it only when you are connected to a trusted Wi-Fi and do not forget to disconnect when you are done (see step 5).
It is important to recognize that there are several fundamental differences in the capabilities of smartphones and tablets as barcode scanning devices. These differences result in a user experience different from purpose-built scanners, impacting the design of the mobile barcode scanning application.
These differences and the general impact they have on your application are the following:
The cmbSDK makes these differences as transparent as possible to the application developer and the user. By following a few simple guidelines, you can develop applications that work and behave the same when using for example an MX-1000 mobile terminal, or just the built-in camera of the device.
Without a hardware trigger, mobile devices must use alternative methods to initiate barcode scanning. There are three common methods used:
The cmbSDK supports all three methods, any of which (or multiple) can be used in an application.
Unlike purpose-built scanners, mobile devices do not have a built-in aimer. Barcode aiming is generally accomplished by providing a live-stream preview from the camera on the mobile device display. The user can then reposition the device until the barcode appears in the field of view and is decoded.
The cmbSDK simplifies this task by providing a built-in preview control that can be displayed fullscreen, partial screen, and in either portrait or landscape orientation.
The cmbSDK also supports "passive" aimers: devices that attach to the mobile device or its case that use the LED flash of the device as a light source to project an aiming or targeting pattern. The advantage of these aimers is that an on-screen preview is no longer required, as the mobile device can project an aimer pattern similar to a purpose-built scanner. However, note that using the LED flash for general scanning illumination is not available because the mobile device flash is used for the aimer.
Mobile devices support developing applications for either portrait orientation, landscape orientation, or auto-rotation between the two. The cmbSDK fully supports all three options for both the presentation of the barcode preview as well as the scan direction. Most barcodes can be scanned by a mobile device regardless of the orientation of the application and/or the mobile device.
For scanning "square" barcodes like QR, Data Matrix, and MaxiCode, any orientation can be used. However, for scanning long or dense barcodes like a large PDF417, using landscape orientation is recommended or even necessary. Mobile cameras have a higher resolution along the "height" of the image in portrait mode. For example, 1280x720 is a commonly used resolution. This means that scanning barcodes using portrait orientation provides 720 pixels of data along the horizontal axis, while landscape orientation provides 1280 pixels on the horizontal scan line for barcode decoding.
With multi-core CPUs and dedicated image processors, today's handheld devices have significant computing power and provide an ideal platform for efficient and cost-effective barcode decoding. It is still recommended for developers to optimize their barcode scanning applications. The cmbSDK is optimized specifically for mobile environments, but image analysis and barcode decoding is still a CPU intensive activity. Since these processes share the mobile device's CPU with the operating system, services, and other applications, developers are advised to limit their applications to only using the features of the SDK that they need.
Application optimizations include the following:
For these reasons, when the cmbSDK is initialized for use with the the mobile device's built-in camera, no barcode symbologies are enabled by default, and the application must only enable the symbologies it needs. As most barcode scanning applications only need to scan a handful of symbologies, this behavior encourages the developer to use the SDK in an efficient manner.
Perform the following steps to install the Android cmbSDK:
If you plan to use the cmbSDK to do mobile scanning with a smartphone or tablet (with no MX mobile terminal), then the SDK requires the installation of a license key. Without a license key, the SDK will still operate, although scanned results will be obfuscated (the SDK will randomly replace characters in the scan result with an asterisk character).
Contact your Cognex Sales Representative for information on how to obtain a license key including trial licenses which can be used for 30 days to evaluate the SDK.
After obtaining your license key, add the following line in your application's AndroidManifest.xml file, under the application tag:
<meta-data android:name="MX_MOBILE_LICENSE" android:value="YOUR_MX_MOBILE_LICENSE"/>
Next, put your key in place of YOUR_MX_MOBILE_LICENSE.
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".ScannerActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="MX_MOBILE_LICENSE"
android:value="g/9ytJzcja+sxt4DTEDxR4hp6sZh9bmL97vUx+EE9uY=" />
</application>
The second way to add the license key is explained in the example below:
// init connection to Phone Camera
case 1:
readerDevice = ReaderDevice.getPhoneCameraDevice(this,
CameraMode.NO_AIMER, PreviewOption.DEFAULTS,
rlPreviewContainer,"SDK_KEY");
Previous SDK versions accessed the MX mobile terminal via direct USB Device or USB Accessory connection. These methods are now deprecated, and you should connect to an MX mobile terminal using the MXConnect application. (See Step 4 .)
The cmbSDK provides an easy factory method, DataManSystem.createDataManSystemForMXDevice() to create a DataManSystem for the MX mobile terminal over the MXConnect application.
Please remove any DataManSystem.createDataManSystemOverUsb() and DataManSystem.createDataManSystemOverUsbAccessory() methods from your project, and also remove the USB_ DEVICE-ATTACHED and USB_ACCESSORY_ATTACHED Intent filters and meta-data from the AndroidManifest.xml file.
You can also delete the USB and accessory descriptor xml files from the XML folder. You can also use and migrate to Barcode SDK to access the MX mobile terminal.
The cmbSDK has been designed to provide a high-level, abstract interface for supported scanning devices. This includes not only the MX series of mobile terminals, but also for applications that intend to use the mobile device camera as the imaging device. The intricacies of communicating with and managing these devices is encapsulated within the SDK itself: leaving the application to just connect to the device of choice, then using it.
The primary interface between your application and a supported barcode scanning device is the ReaderDevice class. This class represents the abstraction layer to the device itself, handling all communication as well as any necessary hardware management (e.g. for smartphone scanning).
Perform the following steps to use the cmbSDK:
Initialize a Reader Device for the type of device you want to use (MX reader or camera reader).
Connect the Reader Device.
Configure the reader (if necessary).
Start scanning.
Initialization, connection, and configuration generally need to be performed only once in your application except for the following cases:
Perform the following steps to set up and start using the cmbSDK:
import com.cognex.dataman.sdk.CameraMode;
import com.cognex.dataman.sdk.ConnectionState;
import com.cognex.dataman.sdk.PreviewOption;
import com.cognex.mobile.barcode.sdk.ReadResult;
import com.cognex.mobile.barcode.sdk.ReadResults;
import com.cognex.mobile.barcode.sdk.ReaderDevice;
import com.cognex.mobile.barcode.sdk.ReaderDevice.Availability;
import com.cognex.mobile.barcode.sdk.ReaderDevice.OnConnectionCompletedListener;
import com.cognex.mobile.barcode.sdk.ReaderDevice.ReaderDeviceListener;
import com.cognex.mobile.barcode.sdk.ReaderDevice.Symbology;
Provide needed UI elements:
ImageView nested inside theViewGroup container with matching size as its parent for showing the last frame of a preview or scanning session:
The below examples use the following:
private RelativeLayout rlPreviewContainer;
private ImageView ivPreview;
3. The following interfaces are necessary to monitor the connection state of the reader and receive information about the read code:
public class ScannerActivity extends Activity implements OnConnectionCompletedListener, ReaderDeviceListener {
....
@Override
public void onConnectionCompleted(ReaderDevice reader, Throwable error) {
if (error != null) {
// READER DISCONNECTED (ERROR OCCURED)
} }
@Override
public void onConnectionStateChanged(ReaderDevice reader) {
if (reader.getConnectionState() == ConnectionState.Connected) { // READER CONNECTED
} else if (reader.getConnectionState() == ConnectionState.Disconnected) { // READER DISCONNECTED
} }
@Override
public void onReadResultReceived(ReaderDevice reader, ReadResults results) {
if (results.getCount() > 0) {
ReadResult result = results.getResultAt(0);
// USE String symbologyName; String code; Bitmap frame; VARIABLES IN YOUR APPLICATION
if (result.isGoodRead()) {
String symbologyName;
String code = result.getReadString();
Symbology symbology = result.getSymbology(); if (symbology != null) {
symbologyName = symbology.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. Instantiate a ReaderDevice object.
The cmbSDK provides two different reader class initializers: one for scanning using an MX mobile terminal (like the MX- 1000 or MX-1502) and another for scanning using the built-in camera of the mobile device (Android Phones, Android Tablets, etc.).
Initialize a Reader Device object for MX readers using the following factory method:
boolean listeningForUSB = false;
ScannerActivity.readerDevice = ReaderDevice.getMXDevice(ScannerActivity.this); if (!listeningForUSB) {
readerDevice.startAvailabilityListening();
listeningForUSB = true;
}
The availability of the MX mobile terminal can change when the device turns ON or OFF, or if the USB cable gets connected or disconnected. You can handle those changes using the following ReaderDeviceListener interface method (implemented in Step 3 above):
public void onAvailabilityChanged(ReaderDevice reader);
Barcode scanning with the built-in camera of the mobile device can be more complex than with an MX mobile terminal. The cmbSDK supports several configurations to provide the maximum flexibility. This includes the support of optional, external aimers/illumination, as well as the ability to customize the appearance of the live-stream preview.
To scan barcodes using the built-in camera of the mobile device, initialize the ReaderDevice object using the getPhoneCameraDevice static method. The camera reader has several options when initialized. The following parameters are required:
The Context parameter simply provides a reference to the activity you are currently in.
The CameraMode parameter is of type CameraMode (defined in CameraMode.java) and it accepts one of the following values:
PASSIVE_AIMER: This initializes the reader to usea passive aimer, which is an accessory that is attached to the mobile device or mobile device case that uses the built-in LED flash of the mobile device as a light source for projecting an aiming pattern. In this mode, no live-stream preview is presented on the device screen, since an aiming pattern will be projected.
FRONT_CAMERA: This initializes the reader to use the mobile front facing camera of the device, if available (not all mobile devices have a front camera). This is an unusual, but possible configuration. Most front facing cameras do not have auto focus and illumination, and provide significantly lower resolution images. This option should be used with care. In this mode, illumination is not available.
All of the above modes provide the following default settings for the reader:
Based on the selected mode, the following additional options and behaviors are set:
The PreviewOption parameter is of type PreviewOption (defined in PreviewOption.java), and is used to change the reader’s default values or override defaults derived from the selected CameraMode. Multiple options can be specified by OR-ing them when passing the parameter. The available options are:
The last parameter of the ViewGroup type specifies the container for the live-stream preview. If the parameter is left null, a full screen preview will be used.
Examples
Create a reader with no aimer, no zoom button, and using a soft trigger:
ScannerActivity.readerDevice = ReaderDevice.getPhoneCameraDevice( ScannerActivity.this,
CameraMode.NO_AIMER,
PreviewOption.NO_ZOOM_BUTTON | PreviewOption.PAUSED, rlPreviewContainer);
This starts a preview with the scanner paused and a soft trigger button to toggle scanning. After pressing the soft trigger button, the rlPreviewContainer should look like this:
The viewfinder in the above image has an active scanning surface, a result of having set active symbologies. For more details on this topic, see Configuring the Reader Device).
From Android 6.0 and above you need to request permission from the user to access the phone camera.
If the phone camera cannot be opened due to permission issues the onConnectionCompleted(readerDevice, error) callback contains a CameraPermissionException in the error parameter.
You can check for this exception type with the instanceof operator and request permission within the Activity.
if (error instanceof CameraPermissionException)
ActivityCompat.requestPermissions(((ScannerActivity) this), new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CODE);
Please note, that you need to implement ActivityCompat.OnRequestPermissionResultCallback interface in your Activity to catch user permission result.
To handle user response in onRequestPermissionResult(…), you may use the following code to retry connecting to the PhoneCamera.
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_PERMISSION_CODE) {
if (grantResults.length > 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)) {
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setMessage("You need to allow access to the Camera")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(
DialogInterface dialogInterface,
int i) {
ActivityCompat.requestPermissions(ScannerActivity.this, new String[]{Manifest.permission.CAMERA}, REQUEST_PERMISSION_CODE);
}
})
.setNegativeButton("Cancel", null);
AlertDialog dialog = builder.create();
dialog.show();
}
}
}
}
Before connecting, set the ReaderDeviceListener object to receive events:
readerDevice.setReaderDeviceListener(ScannerActivity.this);
See Step 3 for details.
Additionally, you can enable sending the last triggered image and SVG from the reader:
readerDevice.enableImage(true);
readerDevice.enableImageGraphics(true);
After initializing the ReaderDevice and setting a listener method to handle responses from the reader, the connect method can be invoked, which takes a OnConnectionCompletedListener (see Step 3 for details) as parameter:
//Make sure the device is turned ON and ready
readerDevice.connect(ScannerActivity.this);
If everything was done correctly, the following listener methods are called with the new ReaderDevice status information. The onConnectionCompleted method (passed as parameter of connect) is also invoked as the connection process completes, providing a Throwable object, if there was a connection error.
public void onConnectionStateChanged(ReaderDevice reader);
public void onConnectionCompleted(ReaderDevice reader, Throwable err
Activate scanning
readerDevice.startScanning();
You can stop scanning with the following:
readerDevice.stopScanning();
The onReadResultReceived listener method (see Step 3 ) is invoked as a barcode was decoded by the reader, or the scanning process has finished.
After connecting to the scanning device, you may want (or need) to change some of its settings. The cmbSDK provides a set of high-level, device independent APIs for setting and retrieving the current configuration of the device.
Like in the case of initializing the Reader Device, there are some differences between using an MX reader and the camera reader for scanning. These differences are detailed in the following sections.
The MX family of mobile terminals provides sophisticated device configuration and management, including saved configurations on the device itself. In general, these devices come from Cognex preconfigured for an exceptional out-of- the-box experience with most symbologies and features ready to use.
When custom reconfiguration is desired, this is typically done using either the DataMan Setup Tool, or the Cognex Quick Setup as these tools can be used to distribute saved configurations easily to multiple devices, thereby greatly simplifying configuration management.
However, it is still possible (and sometimes desirable) for the mobile application itself to configure the MX device:
Much like an MX mobile terminal, the cmbSDK employs a default set of options for barcode reading with the built-in camera of the mobile device, providing a good out-of-box experience. However, there are two important differences to keep in mind:
The cmbSDK does not enable any symbologies by default: you as the application programmer must enable all barcode symbologies your application needs to scan. By requiring the application program to explicitly enable only the symbologies it needs, the most optimal scanning performance can be achieved. This concept was more thoroughly discussed in the Overview section.
Individual symbologies can be enabled using the following method of the Reader Device object:
public void setSymbologyEnabled(final Symbology symbology, final boolean enable, final OnSymbologyListener listener)
readerDevice.setSymbologyEnabled(Symbology.DATAMATRIX, true, null);
readerDevice.setSymbologyEnabled(Symbology.UPC_EAN, true, null);
All symbologies used for the symbology parameter in this method can be found in ReaderDevice.java.
Examples
/* Enable QR scanning */
readerDevice.setSymbologyEnabled(Symbology.QR, true, null);
The same method can also be used to turn symbologies off:
/ * Disable Code 25 scanning */ readerDevice.setSymbologyEnabled(Symbology.C25, false, null);
You can implement the method for OnSymbologiesListener:
@Override
public void onSymbologyEnabled(ReaderDevice reader, Symbology symbology, Boolean enabled, Throwable error) {
if (error != null) {
/* Unsuccessful
probably the symbology is unsupported by
the current device, or there is a problem with the connection between
the readerDevice and MX device
*/
} else {
// Success }
}
If your reader device is equipped with illumination lights (e.g. LEDs), you can control whether they are ON or OFF when scanning starts using the following method of your Reader Device object:
readerDevice.setLightsOn(true, null);
Optionally, you can implement the interface method for OnLightsListener, which is the second parameter of the method.
public class ScannerActivity extends Activity implements .... OnLightsListener .... { ....
@Override
public void onLightsOnCompleted(ReaderDevice reader, Boolean on, Throwable error) {
if (error != null) { // Unsuccessful
} else {
// Success }
} }
Keep in mind that not all devices and device modes supported by the cmbSDK allow for illumination control. For example, if using the built-in camera in passive aimer mode, illumination is not available since the LED is being used for aiming.
If built-in camera is used as reader device you have the possibility to configure zoom levels and define the way these zoom levels are used.
There are 3 zoom levels for the phone camera, which are:
You can define these zoom levels with "SET CAMERA.ZOOM-PERCENT [100-MAX] [100-MAX]" command. It configures how far the two levels will zoom in percentage. 100 is without zoom, and MAX (goes up to 1000) will zoom as far as the device is capable of. First argument is used for setting level 1 zoom, and the second for level 2 zoom.
When you want to check current setting, you can do this with the "GET CAMERA.ZOOM-PERCENT" that returns two values: level 1 and level 2 zoom.
Example
readerDevice.getDataManSystem().sendCommand("SET CAMERA.ZOOM-PERCENT 250 500");
There is another command that sets which zoom level you want to use or returns the actual setting: "GET/SET CAMERA.ZOOM 0-2".
Possible values for the SET command are:
You can call this command before scanning or even during scanning, the zoom goes up to the level that was configured.
If the scanning is finished, the values is reset to normal behavior (0).
Example
readerDevice.getDataManSystem().sendCommand("SET CAMERA.ZOOM 2");
The cmbSDK includes a method for resetting the device to its default settings. In the case of an MX mobile terminal, this is the configuration saved by default (not the factory defaults), while in the case of the built-in camera, these are the defaults identified in Appendix B, where no symbologies will be enabled. This method is the following:
readerDevice.resetConfig(null);
Being an async method, you can monitor its completion using OnResetConfigListener interface passed as an optional parameter to the method.
public class ScannerActivity extends Activity implements .... OnResetConfigListener .... { ....
@Override
public void onResetConfigCompleted(ReaderDevice reader, Throwable error) {
if (error != null) { // Unsuccessful
} else {
// Success }
}
Every Cognex scanning device implements DataMan Control Commands (DMCC), a method for configuring and controlling the device. Virtually every feature of the device can be controlled using this text based language. The API provides a method for sending DMCC commands to the device. Commands exist both for setting and querying configuration properties.
Appendix A includes the complete DMCC reference for use with the camera reader. DMCC commands for other supported devices (e.g. the MX-1000) are included with the documentation of that particular device.
Appendix B provides the default values for the camera reader’s configuration settings as related to the corresponding DMCC setting.
The following examples show different DMCC commands being sent to the device for more advanced configuration.
Examples
//Change the scan direction to omnidirectional
readerDevice.getDataManSystem().sendCommand("SET DECODER.1D-SYMBOLORIENTATION 0", ScannerActivity.this);
//Change live-stream preview's scanning timeout to 10 seconds
readerDevice.getDataManSystem().sendCommand("SET DECODER.MAX-SCAN-TIMEOUT 10", ScannerActivity.this);
You can also invoke DMCC query commands and receive their response in the OnResponseReceivedListener.onResponseReceived() method.
//Get the type of device connected readerDevice.getDataManSystem().sendCommand("GET DEVICE.NAME", 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(); }
} );
}
When using Mobile Camera, cmbSDK allows you to see the Camera Preview inside a preview container or in full screen. This preview also contains an overlay, which can be customized in many ways. The cmbSDK camera overlay is built from buttons for zoom, flash and closing the scanner (in full screen), a progress bar indicating the scan timeout, and lines on the corners of the camera preview.
To use the legacy camera overlay, which was used in the cmbSDK v2.0.x and the ManateeWorks SDK, use this property from MWOverlay before initializing the readerDevice:
MWOverlay.overlayMode = MWOverlay.OverlayMode.OM_LEGACY;
The LEGACY overlay has limited customizability, so it is preferred to use the CMB overlay.
When using the CMB overlay, you can copy the layout files found in the Resources/layout directory into your project and modify them as you like. The files are: cmb_scanner_partial_view.xml used when the scanner is started inside a container (partial view), and cmb_scanner_view.xml when the scanner is started in full screen.
After copying the layout that you need (or both layouts), you can modify them, for example by changing the sizes, positions or color of the views, removing views and even add your own views, like an overlay image. The views that are used by the cmbSDK (zoom, flash, close buttons, the view used for drawing lines on the corners, and the progress bar) are accessed by the sdk using the android:tag attribute, so if you can change everything about those views, make sure the android:tag attribute remains unchanged, otherwise the cmbSDK will not be able to recognize those views and continue to function as if those views were removed.
Both the CMB and the LEGACY overlay allow you to change the images used on the zoom and flash buttons. To do that, all you need to do is to make sure your images have the same name as the ones used by the cmbSDK. You can find the images and names used in the sdk in the Resources/drawable-mdpi and drawable-hdpi directories. While the other resolutions are optional, these two must contain your images with the correct names, so that the proper images will be displayed by the cmbSDK.
Both the CMB and the LEGACY overlay allow you to change the color and width of the rectangle that is displayed when a barcode is detected. Here's an example on how to do that:
MWOverlay.locationLineColor = Color.YELLOW;
MWOverlay.locationLineWidth = 6;
With a properly configured reader, you are now ready to scan barcodes. This can be done by calling the startScanning method from your Reader Device object.
What happens next is based on the type of Reader Device and how it has been configured, but in general:
Scanning stops under one of the following conditions:
When a barcode is decoded successfully (the first case), you will receive a ReadResults iterable result collection object in ReaderDevice listener method, already implemented in Step 3.
@Override
public void onReadResultReceived(ReaderDevice reader, ReadResults results) {
if (results.getCount() > 0) {
ReadResult result = results.getResultAt(0);
// USE String symbologyName; String code; Bitmap frame; VARIABLES IN YOUR APPLICATION
if (result.isGoodRead()) {
String symbologyName;
String code = result.getReadString();
Symbology symbology = result.getSymbology();
if (symbology != null) {
symbologyName = symbology.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
}
In the above example, ivPreview is an ImageView used to display an image of the barcode that was scanned, and tvCode is a TextView used to show the result from the barcode. You can also use the BOOL from result.isGoodRead() to check whether the scan was successful or not.
When a barcode is successfully read, a ReadResult object is created and returned by the onReadResultReceived method. In case of having multiple barcodes successfully read on a single image/frame, multiple ReadResult objects are returned in the ReadResult object.
The ReadResult class has properties describing the result of a barcode read:
When a scanning ends with no successful read, a ReadResult is returned with the goodRead property set to false. This usually happens when scanning is canceled or timed out.
To enable the image and imageGraphics properties being filled in the ReadResult object, you have to set the corresponding enableImage() and/or enableImageGraphics() properties of the ReaderDevice object.
To see an example on how the image and SVG graphics are used and displayed in parallel, refer to the sample applications provided in the SDK package.
Not all supported devices provide SVG graphics.
To access the raw bytes from the scanned barcode, you can use the XML property. The bytes are stored as a Base64 String under the "full_string" tag. Here's an example how you can use a XML parser to extract the raw bytes from the XML property.
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
String tag = "";
// the raw bytes will be stored in this variable
byte[] bytes;
xpp.setInput(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();
}
By default, the image and SVG results are disabled, which means that when scanning, the ReadResults will not contain any data in the corresponding properties.
To enable image results, invoke the enableImage() method from the ReaderDevice object:
readerDevice.enableImage(true);
To enable SVG results, invoke the enableImageGraphics() method on ReaderDevice object:
readerDevice. enableImageGraphics(true);
There might be cases when a device disconnects due to low battery condition or manual cable disconnection. These cases can be detected by the onConnectionStateChanged() method of the ReaderDeviceListener interface.
The following table lists the various DMCC commands supported by the cmbSDK when using the built-in camera for barcode scanning.
GET/SET |
Command |
Parameter(s) |
Description |
|
---|---|---|---|---|
GET/SET |
BATTERY.CHARGE |
|
Returns the current battery level of the device as a percentage. |
|
|
BEEP |
|
Plays the audible beep (tone). |
|
GET/SET |
BEEP.GOOD |
[0-3] [0-2] |
Sets the number of beeps (0-3) and the beep tone/pitch (0- 2, for low, medium, high). For the built-in camera, only a single beep with no pitch control is supported. Thus, 0 1 turns the beep off, 1 1 turns the beep on. |
|
GET/SET | CAMERA.ZOOM | 0-2 |
The possible values for the SET command are: 0 - normal (un-zoomed), 1 - zoom at level 1, 2 - zoom at level 2. This zoom level is used during scanning. When scanning ends it reset to 0. |
x |
GET/SET | CAMERA.ZOOM-PERCENT | [100-MAX] [100-MAX] |
Sets/Returns level 1 zoom (default 150% on Android, 200% on iOS), and level 2 zoom (default 300% on Android, 400% on iOS). Note: The camera needs to be started at least once from sdk to have a proper value for max capable zoom (MAX) |
x |
GET/SET |
CODABAR.CODESIZE |
ON min max OFF min max |
Accepts any length Codabar. |
X X |
GET/SET |
C11.CHKCHAR |
ON | OFF |
Turns Code 11 check digit on/off. |
X |
GET/SET |
C11.CHKCHAR-OPTION |
1 2 |
Requires single checksum. Requires double checksum. |
X X |
GET/SET |
C11.CODESIZE |
ON min max OFF min max |
Accepts any length Code 11. |
X X |
GET/SET |
C25.CODESIZE |
ON min max OFF min max |
Accepts any length Code 25. |
X X |
GET/SET |
C39.ASCII |
ON | OFF |
Turns Code 39 extended ASCII on/off. |
|
GET/SET |
C39.CODESIZE |
ON min max OFF min max |
Accepts any length Code 39. |
|
GET/SET |
C39.CHKCHAR |
ON | OFF |
Turns Code 39 check digit on/off |
|
GET/SET |
C93.ASCII |
ON | OFF |
Turns Code 93 extended ASCII on/off |
X |
GET/SET |
C93.CODESIZE |
ON min max OFF min max |
Accepts any length Code 93. |
|
|
CONFIG.DEFAULT |
|
Resets most of the camera API settings to default, except those noted as not resetting (see Appendix B). To reset all settings, use DEVICE.DEFAULT.
|
|
GET/SET |
DATA.RESULT-TYPE |
0 1 2 4 8 |
Specifies results to be returned (sum of multiple values): None XML stats |
|
GET/SET |
DATABAR.EXPANDED |
ON | OFF |
Turns the DataBar Expanded symbology on/off. |
|
GET/SET |
DATABAR.LIMITED |
ON | OFF |
Turns the DataBar Limited symbology on/off. |
|
GET/SET |
DATABAR.RSS14 |
ON | OFF |
Turns the DataBar RSS14 symbology on/off. |
X |
GET/SET |
DATABAR.RSS14STACK |
ON | OFF |
Turns the DataBar RSS14 Stacked symbology on/off. |
X |
GET/SET |
DECODER.1D- SYMBOLORIENTATION |
0 1 2 3 |
Use omnidirectional scan orientation. |
|
GET/SET |
DECODER.EFFORT |
1-5 |
Sets the effort level for image analysis/decoding. The default is 2. Do not use 4-5 for online scanning. |
X |
GET/SET |
DECODER.MAX-SCAN- TIMEOUT |
1-120 |
Sets the timeout for the live-stream preview. When the timeout is reached, decoding is paused; the live-stream preview will remain on-screen. |
X |
GET | DECODER.MAX-THREADS | Returns the max number of CPU threads supported by the device. | X | |
GET/SET | DECODER.THREADS-USED | [0-MAX] | Specify the max number of CPU threads that the scanner can use during the scanning process. | X |
|
DEVICE.DEFAULT |
|
Resets the camera API settings to default (see Appendix B). |
|
GET |
DEVICE.FIRMWARE-VER |
|
Gets the device firmware version. |
|
GET |
DEVICE.ID |
|
Returns device ID assigned by Cognex to the scanning device. For a built-in camera, SDK returns 53. |
|
GET/SET |
DEVICE.NAME |
|
Returns the name assigned to the device. By default, this is “MX-“ plus the last 6 digits of DEVICE.SERIAL-NUMBER. |
|
GET |
DEVICE.SERIAL- NUMBER |
|
Returns the serial number of the device. For a built-in camera, the SDK assigns a pseudo-random number. |
|
GET |
DEVICE.TYPE |
|
Returns the device name assigned by Cognex to the scanning device. For a built-in camera, SDK returns “MX-Mobile”. |
|
GET/SET |
FOCUS.FOCUSTIME |
0-10 |
Sets the camera’s auto-focus period (how often the camera should attempt to refocus). The default is 3. |
|
GET/SET |
I2O5.CHKCHAR |
ON | OFF |
Turns Interleaved 2 of 5 check digit on/off. |
|
GET/SET |
I205.CODESIZE |
ON min max OFF min max |
Accepts any length Interleaved 2 of 5. |
X X |
GET/SET |
IMAGE.FORMAT |
0 1 2 |
Scanner returns image result in bitmap format. Scanner returns image result in JPEG format. Scanner returns image result in PNG format. |
|
GET/SET |
IMAGE.QUALITY |
10, 15, 20, ...90 |
Specifies JPEG image quality. |
|
GET/SET |
IMAGE.SIZE |
0 1 2 3 |
Scanner returns full size image. Scanner returns 1⁄4 size image. Scanner returns 1/16 size image. Scanner returns 1/62 size image. |
|
GET/SET |
LIGHT.AIMER |
0-1 |
Disables/enables the aimer (when the scanner starts). |
|
GET/SET |
LIGHT.INTERNAL- ENABLE |
ON | OFF |
Enables/disables illumination (when the scanner starts). |
|
GET/SET |
MSI.CHKCHAR |
ON | OFF |
Turns MSI Plessey check digit on/off. |
|
GET/SET |
MSI.CHKCHAR-OPTION |
0 1 2 3 4 5 |
Use mod 10 checksum |
X X |
GET/SET |
MSI.CODESIZE |
ON min max OFF min max |
Accepts any length MSI Plessey. |
X X |
GET/SET |
SYMBOL.AZTECCODE |
ON | OFF |
Turns the Aztec Code symbology on/off. |
|
GET/SET |
SYMBOL.CODABAR |
ON | OFF |
Turns the Codabar symbology on/off. |
|
GET/SET |
SYMBOL.C11 |
ON | OFF |
Turns the Code 11 symbology on/off. |
X |
GET/SET |
SYMBOL.C128 |
ON | OFF |
Turns the Code 128 symbology on/off. |
|
GET/SET |
SYMBOL.C25 |
ON | OFF |
Turns the Code 25 symbology on/off (standard). |
|
GET/SET |
SYMBOL.C39 |
ON | OFF |
Turns the Code 39 symbology on/off. |
|
GET/SET |
SYMBOL.C93 |
ON | OFF |
Turns the Code 93 symbology on/off. |
|
GET/SET |
SYMBOL.COOP |
ON | OFF |
Turns the COOP symbology (Code 25 variant) on/off. |
X |
GET/SET |
SYMBOL.DATAMATRIX |
ON | OFF |
Turns the Data Matrix symbology on/off. |
|
GET/SET |
SYMBOL.DATABAR |
ON | OFF |
Turns the DataBar Expanded and Limited symbologies on/off. |
|
GET/SET |
SYMBOL.DOTCODE |
ON | OFF |
Turns the DotCode symbology on/off. |
|
GET/SET |
SYMBOL.IATA |
ON | OFF |
Turns the IATA symbology (Code 25 variant) on/off. |
X |
GET/SET |
SYMBOL.INVERTED |
ON | OFF |
Turns the Inverted symbology (Code 25 variant) on/off. |
X |
GET/SET |
SYMBOL.ITF14 |
ON | OFF |
Turns the ITF-14 symbology (Code 25 variant) on/off. |
X |
GET/SET |
SYMBOL.UPC-EAN |
ON | OFF |
Turns the UPC-A, UPC-E, EAN-8, and EAN-13 symbologies on/off. |
|
GET/SET |
SYMBOL.MATRIX |
ON | OFF |
Turns the Matrix symbology (Code 25 variant) on/off. |
X |
GET/SET |
SYMBOL.MAXICODE |
ON | OFF |
Turns the MaxiCode symbology on/off. |
X |
GET/SET |
SYMBOL.MSI |
ON | OFF |
Turns the MSI Plessey symbology on/off. |
|
GET/SET |
SYMBOL.PDF417 |
ON | OFF |
Turns the PDF417 symbology on/off. |
|
GET/SET |
SYMBOL.PLANET |
ON | OFF |
Turns the PLANET symbology on/off. |
|
GET/SET |
SYMBOL.POSTNET |
ON | OFF |
Turns the POSTNET symbology on/off. |
|
GET/SET |
SYMBOL.4STATE-IMB |
ON | OFF |
Turns the Intelligent Mail Barcode symbology on/off. |
|
GET/SET |
SYMBOL.4STATE-RMC |
ON | OFF |
Turns the Royal Mail Code symbology on/off. |
|
GET/SET |
SYMBOL.QR |
ON | OFF |
Turns the QR and MicroQR symbologies on/off. |
|
GET/SET |
TRIGGER.TYPE |
0 1 2 3 4 5 |
Not supported Not supported Manual (default) Not supported Not supported Continuous |
|
GET/SET |
UPC-EAN.EAN13 |
ON | OFF |
Turns the EAN-13 symbology on/off. |
X |
GET/SET |
UPC-EAN.EAN8 |
ON | OFF |
Turns the EAN-8 symbology on/off. |
X |
GET/SET |
UPC-EAN.UPC-A |
ON | OFF |
Turns the UPC-A symbology on/off. |
X |
GET/SET |
UPC-EAN.UPC-E |
ON | OFF |
Turns the UPC-E symbology on/off. |
X |
GET/SET |
UPC-EAN.UPCE1 |
ON | OFF |
Turns the UPC-E1 symbology on/off. |
|
GET/SET |
UPC-EAN.SUPPLEMENT |
0 1-4 |
Turns off UPC supplemental codes. Turns on UPC supplemental codes. |
|
GET/SET | VIBRATION.GOOD | ON | OFF | Sets/gets whether to vibrate when a code is read (default is ON) |
The following table lists the defaults the SDK uses on startup for the camera reader.
Setting |
Default Value |
Device Reset Only? |
---|---|---|
BEEP.GOOD |
1 1 (Turn beep on) |
|
C11.CHKCHAR |
OFF |
|
C11.CHKCHAR-OPTION |
1 |
|
C39.ASCII |
OFF |
|
C39.CHKCHAR |
OFF |
|
C93.ASCII |
OFF |
|
COM.DMCC-HEADER |
1 (Include Result ID) |
Y |
COM.DMCC-RESPONSE |
0 (Extended) |
Y |
DATA.RESULT-TYPE |
1 |
Y |
DECODER.1D-SYMBOLORIENTATION |
1 |
|
DECODER.EFFORT |
2 |
|
DECODER.MAX-SCAN-TIMEOUT |
60 |
|
DEVICE.NAME |
“MX-“ + the last six digits of DEVICE.SERIAL-NUMBER |
|
Symbologies (SYMBOL.*) |
OFF (all symbologies are disabled) |
|
Symbology sub-types (groups): DATABAR.EXPANDED UPC-EAN.EAN8 UPC-EAN.UPC-A UPC-EAN.UPC-E UPCE- AN.UPCE1 |
ON OFF OFF OFF ON ON ON ON OFF |
|
FOCUS.FOCUSTIME |
3 |
|
I2O5.CHKCHAR |
OFF |
|
IMAGE.FORMAT |
1 (JPEG) |
|
IMAGE.QUALITY |
50 |
|
IMAGE.SIZE |
1 (1/4 size) |
|
LIGHT.AIMER |
Default based on cameraMode: 0: NoAimer and FrontCamera |
Y |
LIGHT.AIMER-TIMEOUT |
60 |
|
LIGHT.INTERNAL-ENABLE |
OFF |
|
Setting |
Default Value |
Device Reset Only? |
Minimum/maximum code lengths |
ON 4 40 |
|
MSI.CHKCHAR |
OFF |
|
MSI.CHKCHAR-OPTION |
0 |
|
TRIGGER.TYPE |
2 (Manual) |
|
UPC-EAN.SUPPLEMENT |
0 |
|
Observe these precautions when installing the Cognex product, to reduce the risk of injury or equipment damage: