Using Eclipse, we will create a sample project that will interface with the UniPay and will perform the following activities:
- Report Firmware
- Report connected/disconnected
- Turn on/off MSR reader and perform a card capture
OnReceiverListener methods:
- Method to report unsolicited card swipes
- Method to report device connected
- Method to report device disconnected
Step 1: Create New Project
Create a new Android Application project in Eclipse as an Empty Activity
Step 2: Import IDTechSDK for UniPay
Import the necessary libraries
Step 3: Design Interface
Design the User Interface by editing the main layout XML file
Open your layout and add items to so it contains the following buttons/fields (sample code provide at end of section):
- Add a TextView to the top that will signify connection/disconnection status.
- Add a TextView to communicate data from the UniPay. Remove the Editable behavior if you don't want the keyboard to pop up if you accidentally select it.
- Add buttons to execute the following functions:
- Connect
- Disconnect
- Get Firmware
- Start Swipe
- Cancel Swipe
Step 4: Configure Activity File
In the activity file, perform the following:
Layout Source Code (uses theme "Light")
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#aaaaaa"
android:orientation="vertical" >
<TextView
android:id="@+id/status_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#000000"
android:gravity="center_vertical|center_horizontal"
android:text="UNIPAY DISCONNECTED"
android:textColor="#FFFFFF" />
<LinearLayout
android:id="@+id/linearLayoutBottom2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/btn_Connect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.53"
android:gravity="center_vertical|center_horizontal"
android:text="Connect" />
<Button
android:id="@+id/btn_Disconnect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.53"
android:text="Disconnect" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayoutEditText"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:background="#dddddd"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical" >
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginBottom="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="5dp"
android:background="#ffffff" >
<TextView
android:id="@+id/textLog"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text=""
android:textColor="#000000"
android:textSize="12sp"
android:typeface="monospace" >
</TextView>
</ScrollView>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayoutBottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/btn_getFirmware"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.53"
android:gravity="center_vertical|center_horizontal"
android:text="Get Firm" />
<Button
android:id="@+id/btn_startSwipe"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.53"
android:text="Start Swipe" />
<Button
android:id="@+id/btn_cancelSwipe"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.53"
android:text="Cancel Swipe" />
</LinearLayout>
</LinearLayout>
Step 5: Configure Method File
In the activity file, perform the following:
private IDT_Device myUniPayReader = null;
private TextView connectStatusTextView;
private TextView textLog;
private Button btnGetFirmware;
private Button btnStartSwipe;
private Button btnCancelSwipe;
private Handler handler = new Handler();
private boolean isReaderConnected = false;
private String strCard = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler();
btnConnect = (Button)findViewById(R.id.btn_Connect);
btnDisconnect = (Button)findViewById(R.id.btn_Disconnect);
btnGetFirmware = (Button)findViewById(R.id.btn_getFirmware);
btnStartSwipe = (Button)findViewById(R.id.btn_startSwipe);
btnCancelSwipe = (Button)findViewById(R.id.btn_cancelSwipe);
textLog = (TextView)findViewById(R.id.textLog);
connectStatusTextView = (TextView)findViewById(R.id.status_text);
if(myUniPayReader!=null){
myUniPayReader.unregisterListen();
myUniPayReader.release();
myUniPayReader = null;
}
myUniPayReader = new IDT_Device(this,this);
myUniPayReader.registerListen();
loadXMLfile();
}
private Runnable doUpdateStatus = new Runnable()
{
public void run()
{
if(!isReaderConnected){
connectStatusTextView.setText("UNIPAY DISCONNECTED");
}
else{
connectStatusTextView.setText("UNIPAY CONNECTED");
}
}
};
@Override
public void deviceConnected() {
isReaderConnected = true;
handler.post(doUpdateStatus);
}
@Override
public void deviceDisconnected() {
isReaderConnected = false;
handler.post(doUpdateStatus);
}
-Implement protocol delegate com.idtechproducts.device.OnReceiverListener.swipeMSRData() to receive unsolicited card swipe data.
private Runnable m_CardRunnable = new Runnable()
{
public void run()
{
textLog.setText(strCard);
}
};
public void swipeMSRData(IDTMSRData card)
{
String str = new String();
if( card.event == EVENT_MSR_Types.EVENT_MSR_CARD_DATA ||card.event == EVENT_MSR_Types.EVENT_MSR_DATA_ERROR)
{
int len = card.cardData.length;
int i = 0;
str = "CardData:\r\n";
for(i = 0; i < len; i++)
{
str += String.format("%02x ", card.cardData[i]);
}
if(card.track1 != "")
{
str += "\r\nTrack1 data:\r\n";
str += card.track1;
}
if(card.track2 != "")
{
str += "\r\nTrack2 data:\r\n";
str += card.track2;
}
if(card.track3 != "")
{
str += "\r\nTrack3 data:\r\n";
str += card.track3;
}
len = card.encTrack1.length;
if(len > 0)
{
str += "\r\nTrack1 encrypted data:\r\n";
for(i = 0; i < len; i++)
{
str += String.format("%02X", card.encTrack1[i]);
}
}
len = card.encTrack2.length;
if(len > 0)
{
str += "\r\nTrack2 encrypted data:\r\n";
for(i = 0; i < len; i++)
{
str += String.format("%02X", card.encTrack2[i]);
}
}
len = card.encTrack3.length;
if(len > 0)
{
str += "\r\nTrack3 encrypted data:\r\n";
for(i = 0; i < len; i++)
{
str += String.format("%02X", card.encTrack3[i]);
}
}
len = card.KSN.length;
if(len > 0)
{
str += "\r\nKSN:";
for(i = 0; i < len; i++)
{
str += String.format("%02x ", card.KSN[i]);
}
}
str += "\r\nCard Type:";
if(card.cardType == CAPTURE_ENCODE_TYPE.CAPTURE_ENCODE_TYPE_ISOABA)
str += String.format("ISO 7813/ISO 4909/ABA format.");
else if(card.cardType == CAPTURE_ENCODE_TYPE.CAPTURE_ENCODE_TYPE_AAMVA)
str += String.format("AAMVA format.");
else if(card.cardType == CAPTURE_ENCODE_TYPE.CAPTURE_ENCODE_TYPE_Raw)
str += String.format("Raw; un-decoded format.");
else if(card.cardType == CAPTURE_ENCODE_TYPE.CAPTURE_ENCODE_TYPE_JisI_II)
str += String.format("JIS I or JIS II.");
else
str += String.format("Other format.");
str += "\r\nEncode Status:";
str += String.format("%02x ", card.captureEncodeStatus);
str += "\r\nEncrypt Type:";
if(card.captureEncryptType == CAPTURE_ENCRYPT_TYPE.CAPTURE_ENCRYPT_TYPE_TDES)
str += String.format("TDES");
if(card.captureEncryptType == CAPTURE_ENCRYPT_TYPE.CAPTURE_ENCRYPT_TYPE_AES)
str += String.format("AES");
if(card.captureEncryptType == CAPTURE_ENCRYPT_TYPE.CAPTURE_ENCRYPT_TYPE_NONE)
str += String.format("None");
if(card.serialNumber != "")
{
str += "\r\nReader Serial Number:";
str += card.serialNumber;
}
}
else if(card.event == EVENT_MSR_Types.EVENT_MSR_BACKSPACE_KEY)
str = "Press Backspace Key.";
else if(card.event == EVENT_MSR_Types.EVENT_MSR_CANCEL_KEY)
str = "Press Cancel Key.";
else if(card.event == EVENT_MSR_Types.EVENT_MSR_ENTER_KEY)
str = "Press Enter Key.";
else
{
str = "Swipe Card error, error code is ";
str += String.format("%02X %02X ", card.cardData[0],card.cardData[1]);
}
strCard = str;
handler.post(m_CardRunnable);
}
-Implement the button press methods
btnConnect.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
myUniPayReader.device_connect();
}
});
btnDisconnect.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
myUniPayReader.device_disconnect();
}
});
btnStartSwipe.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
String str = new String();
int res = myUniPayReader.msr_startMSRSwipe();
if(res == 0)
{
str = "Start to MSR Swipe successfully,please swipe card.";
}
else
str = myUniPayReader.device_getResponseCodeString(res);
textLog.setText(str);
}
});
btnCancelSwipe.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
String str = new String();
int res = myUniPayReader.msr_cancelMSRSwipe();
if(res == 0)
{
str = "End to MSR Swipe successfully.";
}
else
str = myUniPayReader.device_getResponseCodeString(res);
textLog.setText(str);
}
});
btnGetFirmware.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
StringBuilder version = new StringBuilder();
int res = myUniPayReader.device_getFirmwareVersion(version);
String str = new String();
if(res == 0)
{
str = "Firmware = " + version.toString();
}
else
str = myUniPayReader.device_getResponseCodeString(res);
textLog.setText(str);
}
});
Complete code listing
package com.example.unipay_tutorial;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.idtechproducts.device.*;
import com.idtechproducts.device.ReaderInfo.CAPTURE_ENCODE_TYPE;
import com.idtechproducts.device.ReaderInfo.CAPTURE_ENCRYPT_TYPE;
import com.idtechproducts.device.ReaderInfo.DEVICE_INTERFACE_Types;
import com.idtechproducts.device.ReaderInfo.EVENT_MSR_Types;
public class MainActivity extends Activity implements OnReceiverListener {
private IDT_Device myUniPayReader = null;
private TextView connectStatusTextView;
private TextView textLog;
private Button btnConnect;
private Button btnDisconnect;
private Button btnGetFirmware;
private Button btnStartSwipe;
private Button btnCancelSwipe;
private Handler handler = new Handler();
private boolean isReaderConnected = false;
private String strCard = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler();
btnConnect = (Button)findViewById(R.id.btn_Connect);
btnDisconnect = (Button)findViewById(R.id.btn_Disconnect);
btnGetFirmware = (Button)findViewById(R.id.btn_getFirmware);
btnStartSwipe = (Button)findViewById(R.id.btn_startSwipe);
btnCancelSwipe = (Button)findViewById(R.id.btn_cancelSwipe);
textLog = (TextView)findViewById(R.id.textLog);
connectStatusTextView = (TextView)findViewById(R.id.status_text);
if(myUniPayReader!=null){
myUniPayReader.unregisterListen();
myUniPayReader.release();
myUniPayReader = null;
}
myUniPayReader = new IDT_Device(this,this);
myUniPayReader.registerListen();
loadXMLfile();
btnConnect.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
myUniPayReader.device_connect();
}
});
btnDisconnect.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
myUniPayReader.device_disconnect();
}
});
btnStartSwipe.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
String str = new String();
int res = myUniPayReader.msr_startMSRSwipe();
if(res == 0)
{
str = "Start to MSR Swipe successfully,please swipe card.";
}
else
str = myUniPayReader.device_getResponseCodeString(res);
textLog.setText(str);
}
});
btnCancelSwipe.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
String str = new String();
int res = myUniPayReader.msr_cancelMSRSwipe();
if(res == 0)
{
str = "End to MSR Swipe successfully.";
}
else
str = myUniPayReader.device_getResponseCodeString(res);
textLog.setText(str);
}
});
btnGetFirmware.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
StringBuilder version = new StringBuilder();
int res = myUniPayReader.device_getFirmwareVersion(version);
String str = new String();
if(res == 0)
{
str = "Firmware = " + version.toString();
}
else
str = myUniPayReader.device_getResponseCodeString(res);
textLog.setText(str);
}
});
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN, WindowManager.LayoutParams. FLAG_FULLSCREEN);
myUniPayReader.log_setVerboseLoggingEnable(true);
}
private String getXMLFileFromRaw(String fileName ,int res){
String fileNameWithPath = null;
fileNameWithPath = fileName;
String newFilename = fileName;
try {
InputStream in = getResources().openRawResource(res);
int length = in.available();
byte [] buffer = new byte[length];
in.read(buffer);
in.close();
deleteFile(fileNameWithPath);
FileOutputStream fout = openFileOutput(fileNameWithPath, MODE_PRIVATE);
fout.write(buffer);
fout.close();
File fileDir = this.getFilesDir();
fileNameWithPath = fileDir.getParent() + java.io.File.separator + fileDir.getName();
fileNameWithPath += java.io.File.separator+newFilename;
} catch(Exception e){
e.printStackTrace();
fileNameWithPath = null;
}
return fileNameWithPath;
}
private String getConfigurationFileFromRaw( ){
return getXMLFileFromRaw("idt_unimagcfg_default.xml",R.raw.idt_unimagcfg_default);
}
private boolean isFileExist(String path) {
if(path==null)
return false;
File file = new File(path);
if (!file.exists()) {
return false ;
}
return true;
}
private void loadXMLfile(){
String fileNameWithPath = getConfigurationFileFromRaw();
if(!isFileExist(fileNameWithPath)) {
fileNameWithPath = null;
}
myUniPayReader.config_setXMLFileNameWithPath(fileNameWithPath);
Log.d("Demo Info >>>>>","loadingConfigurationXMLFile begin.");
myUniPayReader.config_loadingConfigurationXMLFile(true);
}
private Runnable doUpdateStatus = new Runnable()
{
public void run()
{
if(!isReaderConnected){
connectStatusTextView.setText("UNIPAY DISCONNECTED");
}
else{
connectStatusTextView.setText("UNIPAY CONNECTED");
}
}
};
@Override
public void deviceConnected() {
isReaderConnected = true;
handler.post(doUpdateStatus);
}
@Override
public void deviceDisconnected() {
isReaderConnected = false;
handler.post(doUpdateStatus);
}
@Override
public void AutoConfigCompleted(StructConfigParameters arg0) {
}
@Override
public void AutoConfigProgress(int arg0) {
}
@Override
public void ICCNotifyInfo(byte[] arg0, String arg1) {
}
@Override
public void LoadXMLConfigFileInfo(int arg0, String arg1) {
}
@Override
public boolean getUserGrant(USER_GRANT_TYPE arg0, String arg1) {
return false;
}
@Override
public void msgAudioVolumeAjustFailed(String arg0) {
}
@Override
public void msgToConnectDevice() {
}
@Override
public void plugStatusChange(DEVICE_INTERFACE_Types interfaceType, boolean deviceInserted) {
}
private Runnable m_CardRunnable = new Runnable()
{
public void run()
{
textLog.setText(strCard);
}
};
public void swipeMSRData(IDTMSRData card)
{
String str = new String();
if( card.event == EVENT_MSR_Types.EVENT_MSR_CARD_DATA ||card.event == EVENT_MSR_Types.EVENT_MSR_DATA_ERROR)
{
int len = card.cardData.length;
int i = 0;
str = "CardData:\r\n";
for(i = 0; i < len; i++)
{
str += String.format("%02x ", card.cardData[i]);
}
if(card.track1 != "")
{
str += "\r\nTrack1 data:\r\n";
str += card.track1;
}
if(card.track2 != "")
{
str += "\r\nTrack2 data:\r\n";
str += card.track2;
}
if(card.track3 != "")
{
str += "\r\nTrack3 data:\r\n";
str += card.track3;
}
len = card.encTrack1.length;
if(len > 0)
{
str += "\r\nTrack1 encrypted data:\r\n";
for(i = 0; i < len; i++)
{
str += String.format("%02X", card.encTrack1[i]);
}
}
len = card.encTrack2.length;
if(len > 0)
{
str += "\r\nTrack2 encrypted data:\r\n";
for(i = 0; i < len; i++)
{
str += String.format("%02X", card.encTrack2[i]);
}
}
len = card.encTrack3.length;
if(len > 0)
{
str += "\r\nTrack3 encrypted data:\r\n";
for(i = 0; i < len; i++)
{
str += String.format("%02X", card.encTrack3[i]);
}
}
len = card.KSN.length;
if(len > 0)
{
str += "\r\nKSN:";
for(i = 0; i < len; i++)
{
str += String.format("%02x ", card.KSN[i]);
}
}
str += "\r\nCard Type:";
if(card.cardType == CAPTURE_ENCODE_TYPE.CAPTURE_ENCODE_TYPE_ISOABA)
str += String.format("ISO 7813/ISO 4909/ABA format.");
else if(card.cardType == CAPTURE_ENCODE_TYPE.CAPTURE_ENCODE_TYPE_AAMVA)
str += String.format("AAMVA format.");
else if(card.cardType == CAPTURE_ENCODE_TYPE.CAPTURE_ENCODE_TYPE_Raw)
str += String.format("Raw; un-decoded format.");
else if(card.cardType == CAPTURE_ENCODE_TYPE.CAPTURE_ENCODE_TYPE_JisI_II)
str += String.format("JIS I or JIS II.");
else
str += String.format("Other format.");
str += "\r\nEncode Status:";
str += String.format("%02x ", card.captureEncodeStatus);
str += "\r\nEncrypt Type:";
if(card.captureEncryptType == CAPTURE_ENCRYPT_TYPE.CAPTURE_ENCRYPT_TYPE_TDES)
str += String.format("TDES");
if(card.captureEncryptType == CAPTURE_ENCRYPT_TYPE.CAPTURE_ENCRYPT_TYPE_AES)
str += String.format("AES");
if(card.captureEncryptType == CAPTURE_ENCRYPT_TYPE.CAPTURE_ENCRYPT_TYPE_NONE)
str += String.format("None");
if(card.serialNumber != "")
{
str += "\r\nReader Serial Number:";
str += card.serialNumber;
}
}
else if(card.event == EVENT_MSR_Types.EVENT_MSR_BACKSPACE_KEY)
str = "Press Backspace Key.";
else if(card.event == EVENT_MSR_Types.EVENT_MSR_CANCEL_KEY)
str = "Press Cancel Key.";
else if(card.event == EVENT_MSR_Types.EVENT_MSR_ENTER_KEY)
str = "Press Enter Key.";
else
{
str = "Swipe Card error, error code is ";
str += String.format("%02X %02X ", card.cardData[0],card.cardData[1]);
}
strCard = str;
handler.post(m_CardRunnable);
}
@Override
public void timeout(String arg0) {
}
}