IDTech Unimag Card Swiper на Android

Я работаю над Android (v2.3) уже пару недель, и я наткнулся на некоторые проблемы с Unimag Card Swiper от IDTECH .

Устройство поставляется с недостаточной документацией, а демонстрационное приложение из SDK реализует обновление прошивки и несколько классов для диалогов и таких, которые действительно отвлекают от того, как достичь базовой функциональности (добавлено к немногим и не очень хорошим комментариям в коде).

Я реализовал интерфейс в основной деятельности и попытался обнаружить, когда устройство подключено или отключено, но, похоже, слушатель захватывает оба события (соединение / разъединение) как «отключить», не говоря уже о попытке прочитать карту.

Кто-нибудь работал с этим устройством на Android и имеет некоторые четкие примеры?

Кстати, вот мой класс:

package com.card.swipe; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import IDTech.MSR.uniMag.uniMagReader; import IDTech.MSR.uniMag.uniMagReaderMsg; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import android.widget.Toast; public class CardSwipeTestActivity extends Activity implements uniMagReaderMsg { private uniMagReader myUniMagReader = null; private TextView etCardData; private String _strMSRData = null; private byte[]_MSRData = null; private String _strStatus = null; private int _nGetChallengeResult = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // InitializeUI(); InitializeReader(); String strManufacture = myUniMagReader.getInfoManufacture(); String strModel = myUniMagReader.getInfoModel(); String strSDKVerInfo = myUniMagReader.getSDKVersionInfo(); String strOSVerInfo = android.os.Build.VERSION.RELEASE; etCardData = (TextView)findViewById(R.id.text_view); etCardData.setText("Phone: "+strManufacture+"\n"+"Model: "+strModel+"\n"+"SDK Ver: "+strSDKVerInfo+"\nOS Version: "+strOSVerInfo); } @Override protected void onPause() { // TODO Auto-generated method stub if(myUniMagReader!=null) { //you should stop swipe card and unregister when the application go to background myUniMagReader.stopSwipeCard(); // myUniMagReader.unregisterListen(); // myUniMagReader.release(); } super.onPause(); } @Override protected void onResume() { // TODO Auto-generated method stub // you should register to listen the headset event when the application resumed. // if(myUniMagReader!=null) // { //// myUniMagReader.registerListen(); // if(_bCheckedSaveLogItem==true) // myUniMagReader.setSaveLogEnable(true); // else // myUniMagReader.setSaveLogEnable(false); // } // if(itemStartSC!=null) // itemStartSC.setEnabled(true); // waitingCommandResult=false; super.onResume(); } @Override protected void onDestroy() { myUniMagReader.release(); super.onDestroy(); android.os.Process.killProcess(android.os.Process.myPid()); } //********************************************************************************// @Override public boolean getUserGrant(int arg0, String arg1) { // TODO Auto-generated method stub return false; } @Override public void onReceiveMsgAutoConfigProgress(int arg0) { // TODO Auto-generated method stub } @Override public void onReceiveMsgCardData(byte arg0, byte[] arg1) { // TODO Auto-generated method stub Log.d("SWIPE", "Card swiped!"); Toast.makeText(getApplicationContext(), "Card swiped!", Toast.LENGTH_SHORT).show(); } @Override public void onReceiveMsgCommandResult(int arg0, byte[] arg1) { // TODO Auto-generated method stub } @Override public void onReceiveMsgConnected() { Log.d("CONNECTION","Swiper Connected"); Toast.makeText(getApplicationContext(), "Swiper Connected!", Toast.LENGTH_SHORT).show(); } @Override public void onReceiveMsgDisconnected() { Log.d("CONNECTION","Swiper Disconnected"); Toast.makeText(getApplicationContext(), "Swiper Disconnected!", Toast.LENGTH_SHORT).show(); } @Override public void onReceiveMsgFailureInfo(int arg0, String arg1) { // TODO Auto-generated method stub Log.d("CONNECTION","Swiper Failure"); } @Override public void onReceiveMsgSDCardDFailed(String arg0) { // TODO Auto-generated method stub } @Override public void onReceiveMsgTimeout(String arg0) { Log.d("TIMEOUT","Timed out!"); Toast.makeText(getApplicationContext(), "Timed out!", Toast.LENGTH_SHORT).show(); } @Override public void onReceiveMsgToConnect() { Log.d("CONNECTION","Swiper Powered Up"); Toast.makeText(getApplicationContext(), "Swiper Powered Up", Toast.LENGTH_SHORT).show(); } @Override public void onReceiveMsgToSwipeCard() { Log.d("SWIPE","Ready to swipe!"); Toast.makeText(getApplicationContext(), "Ready to swipe!", Toast.LENGTH_SHORT).show(); } //********************************************************************************// private void InitializeReader() { if(myUniMagReader==null) myUniMagReader = new uniMagReader(this,this); myUniMagReader.setVerboseLoggingEnable(true); myUniMagReader.registerListen(); //load the XML configuratin file String fileNameWithPath = getXMLFileFromRaw(); if(!isFileExist(fileNameWithPath)) { fileNameWithPath = null; } myUniMagReader.setXMLFileNameWithPath(fileNameWithPath); myUniMagReader.loadingConfigurationXMLFile(true); myUniMagReader.setTimeoutOfSwipeCard(5); } private boolean isFileExist(String path) { if(path==null) return false; File file = new File(path); if (!file.exists()) { return false ; } return true; } private String getXMLFileFromRaw( ){ //the target filename in the application path String fileNameWithPath = null; fileNameWithPath = "idt_unimagcfg_default.xml"; try{ InputStream in = getResources().openRawResource(R.raw.idt_unimagcfg_default); 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(); // to refer to the application path File fileDir = this.getFilesDir(); fileNameWithPath = fileDir.getParent() + java.io.File.separator + fileDir.getName(); fileNameWithPath = fileNameWithPath+java.io.File.separator+"idt_unimagcfg_default.xml"; } catch(Exception e){ e.printStackTrace(); fileNameWithPath = null; } return fileNameWithPath; } public void swipe(View v) { if(myUniMagReader!=null) { myUniMagReader.startSwipeCard(); } if(myUniMagReader.isSwipeCardRunning()==true) { Log.d("SWIPE","Swipe Card Running!"); } } private String getHexStringFromBytes(byte []data) { if(data.length<=0) return null; StringBuffer hexString = new StringBuffer(); String fix = null; for (int i = 0; i < data.length; i++) { fix = Integer.toHexString(0xFF & data[i]); if(fix.length()==1) fix = "0"+fix; hexString.append(fix); } fix = null; fix = hexString.toString(); return fix; } public byte[] getBytesFromHexString(String strHexData) { if (1==strHexData.length()%2) { return null; } byte[] bytes = new byte[strHexData.length()/2]; for (int i=0;i<strHexData.length()/2;i++) { bytes[i] = (byte) Integer.parseInt(strHexData.substring(i*2, (i+1)*2) , 16); } return bytes; } } 

(Там есть некоторые нереализованные методы)

Solutions Collecting From Web of "IDTech Unimag Card Swiper на Android"

Вот что я использовал с UniMag. Используя обработчик для вывода данных с проверкой и кнопку «Проведите», чтобы начать прокрутку. Чтобы улучшить, нужно подождать, пока устройство чтения карт не сообщит, что оно подключено / готово для прокрутки, затем включите кнопку, отключите ее во время ожидания и повторите включение после приема данных.

 import java.util.regex.Matcher; import java.util.regex.Pattern; import IDTech.MSR.XMLManager.StructConfigParameters; import IDTech.MSR.uniMag.uniMagReader; import IDTech.MSR.uniMag.uniMagReaderMsg; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity implements uniMagReaderMsg { private uniMagReader myUniMagReader = null; private Button btnSwipe; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(myUniMagReader == null) { myUniMagReader = new uniMagReader(this,this); myUniMagReader.setSaveLogEnable(false); myUniMagReader.setXMLFileNameWithPath(null); myUniMagReader.loadingConfigurationXMLFile(true); //myUniMagReader.setVerboseLoggingEnable(true); myUniMagReader.registerListen(); } btnSwipe = (Button) findViewById(R.id.button1); btnSwipe.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { myUniMagReader.startSwipeCard(); } }); } @Override public void onDestroy() { myUniMagReader.stopSwipeCard(); myUniMagReader.unregisterListen(); myUniMagReader.release(); super.onDestroy(); } @Override public boolean getUserGrant(int arg0, String arg1) { Log.d("UniMag", "getUserGrant -- " + arg1); return true; } @Override public void onReceiveMsgAutoConfigProgress(int arg0) { // TODO Auto-generated method stub Log.d("UniMag", "onReceiveMsgAutoConfigProgress"); } @Override public void onReceiveMsgCardData(byte arg0, byte[] arg1) { Log.d("UniMag", "onReceiveMsgCardData"); Log.d("UniMag", "Successful swipe!"); String strData = new String(arg1); Log.d("UniMag", "SWIPE - " + strData); if(myUniMagReader.isSwipeCardRunning()) { myUniMagReader.stopSwipeCard(); } // Match the data we want. String pattern = "%B(\\d+)\\^([^\\^]+)\\^(\\d{4})"; Log.d("UniMag", pattern); Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(strData); String card = ""; String name = ""; String exp = ""; String data = ""; if(m.find()) { for(int a = 0; a < m.groupCount(); ++a) { Log.d("UniMag", a + " - "+m.group(a)); } card = m.group(1); name = m.group(2); exp = m.group(3); data = "Data: " + name + " -- " + card + " -- " + exp; Log.d("UniMag", data); Message msg = new Message(); msg.obj = data; swipeHandler.sendMessage(msg); } } final Handler swipeHandler = new Handler() { @Override public void handleMessage(Message msg) { String text = (String)msg.obj; TextView dataView = (TextView) findViewById(R.id.text_view); dataView.setText(text); } }; @Override public void onReceiveMsgCommandResult(int arg0, byte[] arg1) { Log.d("UniMag", "onReceiveMsgCommandResult"); } @Override public void onReceiveMsgConnected() { Log.d("UniMag", "onReceiveMsgConnected"); Log.d("UniMag", "Card reader is connected."); } @Override public void onReceiveMsgDisconnected() { Log.d("UniMag", "onReceiveMsgDisconnected"); if(myUniMagReader.isSwipeCardRunning()) { myUniMagReader.stopSwipeCard(); } myUniMagReader.release(); } @Override public void onReceiveMsgFailureInfo(int arg0, String arg1) { Log.d("UniMag","onReceiveMsgFailureInfo -- " + arg1); } @Override public void onReceiveMsgSDCardDFailed(String arg0) { Log.d("UniMag", "onReceiveMsgSDCardDFailed -- " + arg0); } @Override public void onReceiveMsgTimeout(String arg0) { Log.d("UniMag", "onReceiveMsgTimeout -- " + arg0); Log.d("UniMag","Timed out!"); } @Override public void onReceiveMsgToConnect() { Log.d("UniMag","Swiper Powered Up"); } @Override public void onReceiveMsgToSwipeCard() { Log.d("UniMag","onReceiveMsgToSwipeCard"); } @Override public void onReceiveMsgAutoConfigCompleted(StructConfigParameters arg0) { Log.d("UniMag", "onReceiveMsgAutoConfigCompleted"); } } 

Я обнаружил, что в демонстрационном приложении 3.8, которое они отправляют с SDK, есть ошибка, когда он не будет подключаться к планшету Android gt-p3113, если вы не заходите в настройки приложения на телефоне и не выключаете «Command To Connect».