Overview
The EMDK Barcode API enables an app to capture a signature by designating a predefined, specially formatted area of the screen as an image. This functionality is modeled as a decoder type exposed through the Barcode API. The captured signature can be retrieved by processing the data returned to the application from a scan event using the OnData
callback.
A typical signature capture barcode.
For help creating a signature-capture barcode like the one above, please refer to the Signature Capture Code Guide (pdf).
Enable Signature Capture
Before an application can capture a signature, the corresponding decoder (i.e. signature) must be enabled. Get an instance of a scanner object (see Barcode Scanning API Programmer's Guide for details). Once initialized, modify the scanner configuration as below:
ScannerConfig config = scanner.getConfig();
config.decoderParams.signature.enabled = true; //enables signature decoder
scanner.setConfig(config);
Configure Parameters
By default, the following values are configured for signature decoder parameters. Change the parameters based on specific requirements.
ScannerConfig config = scanner.getConfig();
config.decoderParams.signature.format = ScannerConfig.SignatureImageFormat.BMP; //supported image formats: JPEG, BMP, TIFF
config.decoderParams.signature.width = 400; //specifies the desired output image width in number of pixels. Match the width-to-height aspect ratio to that of the signature capture barcode to avoid distortion of captured image.
config.decoderParams.signature.height = 400; //specifies the image height (in pixels) of the desired output. Match the width-to-height aspect ratio to that of the signature capture barcode to avoid distortion of captured image.
config.decoderParams.signature.bpp = ScannerConfig.SignatureImageBitsPerPixel.BPP_8; //not applicable if the signature format parameter is set to JPEG. Supported values: BPP_1 (2 levels), BPP_4 (64 levels), BPP_8 (256 levels)
config.decoderParams.signature.jpegQuality = 65; //accepts values from 5 (smallest size) to 100 (highest quality) in increments of 5.
scanner.setConfig(config);
ScanData Handling
Data is returned to the application from a scan event through the OnData
callback and is contained in a ScanDataCollection
object. The code snippet below demonstrates how to access the captured signature:
@Override
public void onData(ScanDataCollection scanDataCollection) {
if ((scanDataCollection != null) && (scanDataCollection.getResult() == ScannerResults.SUCCESS)) {
ArrayList <ScanData> scanData = scanDataCollection.getScanData();
for(ScanData data : scanData) {
if(data.getLabelType() == ScanDataCollection.LabelType.SIGNATURE) {
byte[] sigDataArr = data.getRawData(); //holds the complete signature data byte array
}
}
}
}
Raw Signature Data
The code snippet below demonstrates how to access the raw signature data from a ScanDataCollection.
byte[] sigDataArr //holds the total signature data byte array
for(ScanData data : scanData) {
if(data.getLabelType() == ScanDataCollection.LabelType.SIGNATURE) {
sigDataArr = data.getRawData();
}
}
Parse Raw Signature Data
Data obtained from the ScanData.getRawData()
method contains the captured signature image details as a byte array. Information such as signature image format, type, size and image data can be parsed as below.
Get Image Format
The first byte of the byte array holds the image format.
.jpg
- (reserved)
.bmp
.tiff
Get the image format:
int imageFormat = sigDataArr[0];
Get Signature Type
The signature type is held in the second byte of the byte array. The image below illustrates how to differentiate signature types:
The table below lists the accepted start/stop patterns. The bar and space widths are expressed as multiples of X. Values must be the same pattern on either side of a signature capture box. The signature type value is reported with the captured signature image.
For help creating a signature-capture barcode like the one above, please refer to the Signature Capture Code Guide (pdf).
int signatureType = sigDataArr[1]; //supported signature types: 2, 5, 7, 8, 9
Get Image Data Size
Bytes 3 through 6 of the byte array hold the image data size. Retrieve the data using the code below:
byte[] sigDataArr //holds the total signature data byte array
byte[] sizeDataArr = Arrays.copyOfRange(sigDataArr, 2, 6); //holds the image data size byte array
Convert Byte Array to Integer
Convert the byte array data from hex to integer using the following code:
public static int byteArrayToInt(byte[] byteArr)
{
return byteArr[3] & 0xFF |
(byteArr[2] & 0xFF) << 8 |
(byteArr[1] & 0xFF) << 16 |
(byteArr[0] & 0xFF) << 24;
}
int imageDataSize = byteArrayToInt(sizeDataArr);
Get Image Data
The image data is held in bytes 7 through N of the byte array. Use the code below to retrieve the data:
byte[] sigDataArr //holds the total signature data byte array
byte[] imgDataArr = Arrays.copyOfRange(sigDataArr, 6, sigDataArr.length);
Show Image as Bitmap
To display the image as a bitmap, use the following code:
byte[] imgDataArr //holds the image data byte array
ImageView imageView = (ImageView)findViewById(R.id.imageView);
imageView.setImageResource(android.R.color.transparent);
Bitmap bmp = BitmapFactory.decodeByteArray(imgDataArr, 0, imgDataArr.length);
imageView.setImageBitmap(bmp);