Overview
EMDK for Android extends the Android Studio IDE for Mac OS and Windows with tools for easily creating powerful line-of-business applications for Zebra Android devices. EMDK for Android includes class libraries, sample apps and source code that enables developers to easily build apps that take full advantage of the power of Zebra devices.
Also included is Profile Manager, which enhances Android IDE with a GUI-based tool for generating all the code required to access and configure Zebra device features and settings. This enables developers to target Zebra devices with fewer lines of code, fewer errors and reduced overall development time.
Important: Zebra now distributes the EMDK SDK through a JCenter repository, and the EMDK Profile Manager plug-in through the JetBrains plug-in repository. To install, see the EMDK-A Setup guide.
Supported Devices
Mobile devices
- MC33 - Nougat, Oreo
- PS20 - Oreo
- TC20 - Nougat, Oreo (added Feb., 2019; no device refresh req'd)
- TC25 - Nougat
- TC51 - Nougat, Oreo
- TC52 - Oreo
- TC56 - Nougat, Oreo
- TC57 - Oreo
- TC70x - Nougat, Oreo
- TC72 - Oreo
- TC75x - Nougat, Oreo
- TC77 - Oreo
- VC80x - Nougat, Oreo
- WT6000 - Nougat
Scanners and imagers
- DS2278
- DS3608
- DS3678
- LI3608
- LI3678
- RS507
- RS4000
- RS5000
- RS6000
New in v7.1
- Support for Zebra TC20 device running Android 8.1 Oreo (added Feb., 2019)
- Supports Android Multi-user mode. See the Multi-user Programming guide for more information.
UPDATED FEB. 12 2019:
- EMDK for Android 7.0 (and later) has been certified to support Android Studio 3.3, which was released to the stable channel on Feb. 5.
- The EMDK-A 7.1 plug-in will be released soon. The EMDK-A 7.0 plug-in is fully compatible for use in the meantime.
UPDATED MAR. 13 2019:
Enhanced Barcode Manager API includes the following features for devices running Android 8.1 Oreo:
- Support for Decode Screen Notification enables a screen overlay to be displayed after successful decodes.
- New scanner parameter in
ScannerConfig.ScanParams
:decodeScreenNotification
enables/disables decode screen notifications
- New Presentation mode enables motion-based scanning without trigger press:
- Updated
ScannerConfig
enum AimType enables this mode
- Updated
Version History
Added in 6.10, 7.0
Important: Zebra now distributes the EMDK SDK through a JCenter repository, and the EMDK Profile Manager plug-in through the JetBrains plug-in repository. To install, see the EMDK-A Setup guide.
Device Support
EMDK 7.0 adds support for the following mobile computers running Android 8.1 Oreo:
- PS20 Personal Shopper
- TC52 Touch Computer
- TC57 Touch Computer
- TC72 Touch Computer
- TC77 Touch Computer
This version adds support for the following scanners and/or imagers:
- DS2278 Standard range barcode scanner
End of Support
IMPORTANT: EMDK 7.0 no longer targets devices running Android 5.x Lollipop or older.
DEVICES NO LONGER SUPPORTED with Lollipop (and older):
- ET5x
- MC18
- MC32N0
- MC40
- TC70
- TC75
- TC8000
- WT6000
API enhancements
Applies only to devices running Android 8.1.0 (Oreo) and higher.
Enhanced Barcode Manager API
- Supports new symbologies and label types: GS1 Datamatrix and GS1 QR Code
- Differentiates between Datamatrix and GS1 Datamatrix label types
- Differentiates between QR Code and GS1 QR Code label types
- Added Digimarc decoding through a reader parameter:
- New digimarcDecoding parameter in
ImagerSpecific
class (supported on internal imagers only)
- New digimarcDecoding parameter in
- Supports character set selection, including the following new parameters in
ImagerSpecific
,CameraSpecific
andLaserSpecific
classes:characterSetSelection
- Sets the character set used to decode the returned barcode data. Generally set to match the encoding of the physical barcode to be scanned (AUTO, ISO_8859_1, Shift_JIS, GB18030, UTF_8).autoCharacterSetPreferredOrder
- Sets the preferred character set order to decode the barcode data when character set selection is set to "Auto."autoCharacterSetFailureOption
- Used as the character set (NONE, ISO_8859_1, Shift_JIS, GB18030, UTF_8) if the system cannot find a character set from the preferred order that can correctly decode the data.
- Supports Zebra DS2278 Bluetooth scanner:
- New enum under
BarcodeManager.DeviceIdentifier
for selecting the DS2278.
- New enum under
- Supports
PRESS_AND_SUSTAIN
AimType for RS6000 and RS507 Bluetooth scanners.
Personal Shopper API
- Supports
PersonalShopper
API for use with Zebra PS20 Personal Shopper device.- Supports Cradle API
- Supports Diagnostic API
Software Support
Support for MX 8.2 provides the following enhancements:
- Enhanced UI Manager adds these new features:
- Enable/disable long-press on HOME key
- Enable/disable date in Notification panel
- Enable/disable long press on Recent Apps header icon to control access to app info
Support for MX 8.1 provides the following enhancements:
- Enhanced Power Manager adds these new actions:
- Specify an on-device file to verify an OS update
- Specify whether to suppress auto-reboot following an A/B upgrade
- Enhanced Battery Manager adds these new actions:
- Enable/disable use of Battery Swap Mode UI
- Enable/disable “battery charging” LED
- Enhanced Bug Report Manager adds a new action:
- Specify a time before expiration (in days) to store or email bug reports or send them to the cloud
- Enhanced Cellular Manager adds these new actions:
- Enable/disable user access to public land mobile network (PLMN) a device uses
- Specify the MCC/MNC network PLMN LockSet
- Show/hide PLMN lock UI
- Determine the status of PLMN lock UI
- Enable/disable Dual SIM Standby
- Get the status of DSDS
- Enhanced DHCP Option Manager adds these new actions:
- Enable/disable requests for a custom DHCP option from server
- Request or disable a specified DHCP Option
- Enable/disable sending of a custom DHCP Option to server
- Send or disable a specified DHCP Option
- Send a value with a specified custom DHCP Option
- Enhanced License Manager adds these new actions:
- Specify an Activation ID to return a license from the device
- Specify server friendly name for returning one or all licenses and for deleting license source
- Select the license source type to be used to return one or all licenses
- Enhanced Settings Manager adds these new actions:
- Enable/disable the slide out drawer for accessing Android system settings
- Enhanced UI Manager adds these new actions:
- Enable/disable Split Screen mode
- Enable/disable Do Not Disturb mode
- Enable/disable Multi-user mode
- Enhanced Wi-Fi adds these new actions:
- Enable/disable MAC address randomization
- Enable/disable Call Admission Control
- Enable/disable user control of Hotspot state (active/inactive)
Deprecations
SecureNFC APIs, which allow applications to perform secure communications with NFC tags such as MifareDesfire, MifarePlus SL3 using the Secure Access Module (SAM), remain supported but are no longer being advanced.
End of Support
EMDK 7.0 no longer supports target devices running Android 5.x Lollipop or older; support for Lollipop devices ended with EMDK 6.9. In general, EMDK updates for specific devices are distributed with the latest BSP or LifeGuard patch.
Other Notes
EMDK code samples no longer include
ProfileDataCaptureSample1
andSecureNFCSample1
.EMDK-A 7.0 is the last version able to target devices running Android 6.x Marshmallow.
Version History
Added in v6.9
EMDK 6.9 added support for the following Zebra devices/OSes:
- LI3608 rugged USB scanner
- LI3678 rugged Bluetooth scanner
- WT6000 running Android Nougat
API Enhancements
Enhanced Barcode Manager API:
- Adds support for LI3608 rugged USB scanner
- A new enum under
BarcodeManager.DeviceIdentifier
can be used to select the LI3608
- A new enum under
- Adds support for LI3678 rugged Bluetooth scanner
- A new enum under
BarcodeManager.DeviceIdentifier
can be used to select the LI3678
- A new enum under
Enhanced Notification Manager API:
- A new
getDeviceIdentifier()
method inDeviceInfo
class identifies the notification device - A new enum
DeviceIdentifier
supportsgetDeviceIdentifier()
with following values:- DEFAULT - default
- BLUETOOTH_IMAGER_RS6000 - Bluetooth imager RS6000
- EXTERNAL_VIBRATOR1 - External Vibrator
Software Support
Now supports Android Studio 3.1
Now supports MX 8.0 in Profile Manager adds the following Settings Types and features:
- Enhanced App Manager adds these new actions:
- Clear Application Cache
- Enable/disable All GMS Applications on the "Safe to Disable" list
- Enhanced License Manager adds these new actions:
- Select a licensing file to be embedded in the XML
- Select a pre-activated license source
- Query product-specific license information
- Specify product name to be queried
- Select the method used to supply the license .bin file
- Enhanced Power Manager adds a new action:
- Enable/disable PTT and scan buttons to wake the device from suspend mode
- Enhanced Settings Manager adds a new action:
- Enable/disable tethering and portable hotspot features
- Enhanced UI Manager adds these new actions:
- Enable/disable the Magnification Gesture
- Show/hide the Virtual KeyBoard while Physical Keyboard is active
Deprecations
- SecureNFC APIs allow applications to perform secure communications with the NFC tags such as MifareDesfire, MifarePlus SL3 using the Secure Access Module (SAM). These APIs remain supported but are no longer being advanced.
- The ProfileConfig class, used to access profile data, remains supported but is no longer being advanced. Zebra recommends using the name-value pair function of the Profile Manager. Profile XML data also can be modified directly. See the Clock Sample for information about how to modify Profile XML data.
- The ContinuousRead class, used to enable continuous scanning, remains supported but is no longer being advanced. Zebra recommends using the
aimType
,sameSymbolTimeout
,differentSymbolTimeout
of the camera-, imager- and laser-specific reader parameters. - The picklist field, used for enabling picklist mode, remains supported but is no longer being advanced. Use the
picklistEx
field instead.
Usage Notes
General Interest
- Initial settings for a project can be found at Creating a Project using Android Studio.
- Integrator is a utility included with EMDK that can be used to install EMDK for Android components to installations of Android Studio development environment on the host PC.
- If two applications are making modifications to the same profile, the settings of last modification will be effective for that profile. If both applications need their own settings to be effective and still want to use the same profile name, both applications must set the profile every time they come to foreground. However, if both applications create or modify the same DataCapture profile simultaneously, one of the operations will fail.
- Zebra recommends closing all Android Studio windows before proceeding with uninstallation. Failure to do so might not remove the plug-in component from Android Studio. To remove it manually, go to plug-ins folder (
<Android Studio installation path>\plugins
) and delete folder:com.symbol.emdk.wizard.intellijIdea
. - Wi-Fi: To use the Advanced Options under Wi-Fi, follow these steps:
- PMKID must be enabled to enable PreAuth (PreAuth=1 and PMKID=1)
- FT must be enabled to enable FTRIC (FT=1 and FTRIC=1)
- OKC must be disabled (OKC=0 and PMKID=1) to use PMKID caching
- Important Note: The default “Fast Power Savings” value must be used for the “Power Save” parameter under the Advanced Options. Using the “Do Not Change” value will fail.
- Analytics Manager: “Enable File Upload” option is deprecated and removed (in MX 6.0). Use “File Upload” switch under newly introduced “Feature Switch” section instead. When migrating the profile to new MX version, please note that the configuration will lose the user selection for this field. Zebra recommends editing the configuration to set the “File Upload” options as required in the Analytics Manager configuration.
- If the Bluetooth pairing information for RS507 in previous connection attempts has been deleted on the device side, the next connection attempt might fail. The workaround is to clean-boot the RS507 and retry.
- When a BarcodeManager instance is created, EMDK disables DataWedge, effecting any application using DataWedge. When BarcodeManager is released, EMDK re-enables DataWedge.
- If an application is to use BarcodeManager and ScanAndPairManager features, the first feature instance must be released before getting the other feature instance. Simultaneous use of BarcodeManager and ScanAndPairManager is not allowed.
- ProfileManager has been enhanced to support simultaneous usage in multiple applications. This means that an individual application is need required to release EMDKManager > ProfileManager before going to the background. In previous versions, if an application going to the background did not release the ProfileManager, no other applications could access ProfileManager. However, the following restrictions still apply:
- Only one instance of EMDKManager can be used in an application.
- Only one instance of ProfileManager can be used in an application.
- Other than the ProfileManager, all other features (i.e. EMDKManager > BarcodeManager) used in an application must be released before another application can use that feature.
- All instances of all features including EMDKManager must be released before exiting the application.
- A specific EMDK Profile Manager feature such as KeyMapping Manager might not be supported on all devices supported by EMDK. For details about feature support for specific devices, see the MX Feature Matrix and follow instructions there.
- EMDK does not support Managed Profiles in devices running Android Marshmallow and higher. In a device with Managed Profiles enabled, when an EMDK sample app is installed via File Browser, MDM, etc. only a Personal (unmanaged) app of the EMDK sample will be created and function properly. A Work (managed) app of the EMDK sample will not be created. If an EMDK sample app is installed via Android Debug Bridge (ADB) in a device with Managed Profiles enabled, the Work app as well as the Personal app of the EMDK sample will be created in the device. Only the Personal app will behave as expected, not the Work (Managed) app.
- To EMDK applications cannot use the same serial port at the same time. In addition, if DataWedge serial input is enabled for a port in an active profile, it should be disabled before using the port in EMDK. If the port is already in use, attempts to use the port by EMDK will fail.
- If a VC80x device is connected to a computer via USB cable, serial port communications are blocked. Zebra recommends removing the USB cable before using the serial port.
API-related Usage
- A profile name argument (the first argument of
processProfile
API) is mandatory. - If the profile name is given in the
extraData
(third argument of processProfile API) and if it does not match the profile name (first argument ofprocessProfile
API), the profile will NOT be modified. - The profile name provided in
extraData
(third argument ofprocessProfile
API) is ignored if a profile segment is present incriteria
(first argument ofprocessProfile
API). - Developers must implement
EMDKListener
and wait foronOpened()
before making any API call. If making any API calls insideonResume()
, check the status of theEMDKManager
object first. In some cases,onResume()
can be called before theonOpened()
callback, and theEMDKManager
object can become null. - The
EMDKManager.release()
without an argument specifying the specific feature type (ex: FEATURE_TYPE.BARCODE) releases all the resources bound to underlying features. This API must be called before exiting the application only. Zebra recommends the usingonDestroy()
callback for this purpose. - Profile API: The profile applied by passing
extraData
in Profile Manager's process profile method is stored in the memory until the Profile Manager is released or process profile method is called withPROFILE_FLAG.RESET
. - To determine if the
processProfile
API is successful, check the “statusCode." If the statusCode is set to “CHECK_XML," traverse through the response XML (embedded inEMDKResults
) to obtain the error. The EMDK samples demonstrate the manipulation of response XML for errors. - In some cases the
EMDKResults.getExtendedStatusMessage()
might not provide correct status information. - Barcode API: Setting scanner configurations is not allowed while a read is pending. This behavior is demonstrated in the BarcodeSample1 code as well.
- Barcode API: To handle barcode scanning during device suspend-resume cycle (ex: pressing Power key) or background-foreground switching (ex: pressing Home key), it is required to release BarcodeManager instance by calling
EMDKManager.release(FEATURE_TYPE.BARCODE)
during suspend/switching to background and gain new BarcodeManager instance by callingEMDKManager.getInstance(FEATURE_TYPE.BARCODE)
during resume/switching to foreground. Zebra recommends usingonPause()
andonResume()
callbacks for this purpose. This behavior is demonstrated in the BarcodeSample1 code as well. - Barcode API: The RS507 Bluetooth scanner supports device wake-up from suspend by pressing RS507 trigger. To use this feature, the RS507 scanner should not be disabled when the device goes to suspend. The generally recommended practice is to release the barcode scanner during device suspend or moving an app to the background.
- EMDK API calls such as Barcode, SimulScan and SerialComm are designed to be called sequentially. If called within separate threads, such as from AsyncTasks, some kind of synchronization mechanism should be employed to prevent multiple EMDK API calls getting called simultaneously.
- Barcode API While using Bluetooth and Pluggable scanners such as RS507, RS6000, RS4000, when the scanner DISCONNECTED event is received, the created scanner object must be released and cannot be used for future scanning tasks. When the subsequent CONNECTED event is received, a new scanner object must be created and used for scanning. See the Using Bluetooth Scanner tutorial or the BarcodeSample1 application for more programming information. Zebra recommends maintaining a time gap between every DISCONNECT and CONNECT for the Pluggable scanner devices.
- The beam timer for RS507 scanners has a maximum value of 10 (seconds).
- Barcode API Specifying any custom audio file with the same name as one of the system audio files (/system/media/audio/notifications/) for
decodeAudioFeedbackUri
inScannerConfig.ScannerParams
will play a system audio file instead of the specified custom audio file. This is working as designed. - SimulScan API When
SimulScanReader.read()
is called and if there are any unlicensed features in the selected template, an ERROR state is returned with extended status as "UNLICENSED_FEATURE
" for each unlicensed feature in the template. UseSimulScanStatusData.getStatusDescription()
to view the name of the unlicensed feature(s). - ScanAndPair API: Using the Bluetooth Name requires location permission to discover the nearby Bluetooth devices on devices running Android Marshmallow and higher. These permissions are enabled by default in EMDK. Turning off these permissions manually (Settings > Apps > EMDK Service > Permissions) in the EMDK service would result in failure to pair the Bluetooth device using ScanAndPair.
- Barcode and SimulScan APIs require camera permission to use the device camera for scanning and document capture on devices running Android Marshmallow and higher. These permissions are enabled by default in EMDK. Turning off these permissions manually (Settings > Apps > EMDK Service > Permissions) in the EMDK service would result in failure to use the camera in Barcode and SimulScan.
- SerialComm API Calling
SerialComm.enable()
,SerialComm.read()
andSerialComm.write()
while serial cables are disconnected might not throw an exception. Some kind of a mechanism should be employed to determine whether a cable is connected. - MultiBarcode scanning:
- Barcodes can be of multiple label types. If the required number of barcodes (from 1-10, as set using the
BarcodeCount
parameter) is not in view of the scanner, the scanner will not decode any data. - If the scanner's field of view contains a number of barcodes greater than the value set by
BarcodeCount
, the scanner will randomly decode any barcode(s) until the count is reached. For example, if the count is set to two and eight barcodes are in the field of view, the scanner returns data for the first two barcodes it sees, and returns the data in random order. - There is no guarantee that the order of returned data will be the same on any two scans; order of individual barcode data can vary with each scan.
- In multi-barcode scanning mode, when a picklist reader parameter is set to a value other than “Disabled," the user is expected to move the cross-hair to the specified number of barcodes to be scanned. Set this value (from 2-10) using the
BarcodeCount
parameter. Data is returned only after the specified number of barcodes is read.
- Barcodes can be of multiple label types. If the required number of barcodes (from 1-10, as set using the
Added in v6.8
- Supports compiling applications to Android API level 26 with new "EMDK APIs, Android 26, rev xx (API 26)" add-on
Enhanced Barcode Manager API:
- Supports Multi-barcode decoding
- New
MULTI_BARCODE
value inenum
ScanMode enables simultaneous decoding of multiple barcodes - New
MultiBarcodeParams
class inScannerConfig
addsbarcodeCount
parameter to set the barcode count to be scanned - New
PRESS_AND_SUSTAIN
AimType avoids canceling a read by subsequently pressing the trigger button (TC20/TC25 devices only)
Enhanced SerialComm API:
flowControlMode
under Serial Config takesRTS_CTS
,XON_XOFF
andNONE
values
Enhanced Profile Manager DataCapture:
- Supports Serial Input plug-in
- Support Zebra DS-3608 scanner
- Support for Multi-barcode decoding:
- New
Multi Barcode
Scanning Mode option in Reader parameters enables simultaneous decoding of multiple barcodes - New
Barcode count
field under Multi-barcode parameters allows a barcode count to be set
- New
- Supports sending ENTER command as a string
- Enhanced support for Inter-character delay
- New
PRESS_AND_SUSTAIN
AimType avoids canceling a read by subsequently pressing the trigger button (TC20/TC25 devices only)
Support for MX 7.2 adds the following Setting Types and features:
- Enhanced Display Manager CSP:
- On VC80 devices, adds the ability to force the display to “Stay Awake” and remain on.
- Enhanced Power Manager CSP:
- Turn ON/OFF “Doze Mode” energy saving features on the device. When enabled, only specially designated apps can prevent the device from entering a low-power state to preserve battery life.
- Enhanced Remote Scanner Manager CSP:
- Supports RS-507 and DS-3608 scanners
- Enhanced Settings Manager CSP:
- Enable/Disable application notification control on devices running Android Nougat
Deprecations
Support for configuring DataWedge using EMDK Profile Manager is deprecated. Profile Manager capabilities categorized under Data Capture are still supported but will no longer be advanced. Zebra recommends using DataWedge intent-based APIs to configure DataWedge profiles going forward.
Support for
ProfileConfig
class has been deprecated. This class, which can be used to access profile data, remains supported but will no longer be advanced. Instead, Zebra recommends using the name-value pair function of Profile Manager or carefully modifying the Profile XML directly. Refer to the Clock Sample for information about modifying Profile XML data.Support for the
ContinuousRead
class is deprecated. This class, which can be used to enable continuous scanning, is still supported but will no longer be advanced. Zebra recommends using theaimType
,sameSymbolTimeout
,differentSymbolTimeout
reader parameters for the device camera, imager or laser.Support for the
picklist
field is deprecated. This field, which is used for enabling thepicklist
mode, is still support but will ultimately be replaced by thepicklistEx
field.
Components
Profile Manager
The EMDK's exclusive Profile Manager Technology is an additional advantage for developers giving you a GUI based development tool built on our open framework. This allows you to write fewer lines of code resulting in reduced development time, effort and errors. This innovative feature not only gives you easy access to critical functions such as bar code scanning and transaction processing via a magnetic stripe reader (MSR) but also functionality not available in Google's Android SDK.
Samples & Programmer's Guide
There are sample projects that are included as part of the EMDK For Android installation. You can import the project into your IDE and run on your device. Look at the Sample Guide for more details on using these samples. You can also reference the Programmers Guide for a complete walk-through of building your first EMDK For Android application.
Java APIs
The EMDK for Android offers access to the device's Barcode capabilities through traditional native Java Barcode APIs.