2012-08-22 26 views
11

我一直在努力的Android(V2.3)了幾個星期的,現在,我已經在一些問題從IDTECH的Unimag卡組隊,探索跌跌撞撞。IDTech Unimag卡組隊,探索在Android

該設備附帶了一份稀缺的文檔,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; 
    } 
} 

(有一些未實現的方法有作爲)

+0

你是否順便解決了這個問題? – dariopy

+0

是的,我做了,在解決方案上查看我的評論。我早就解決了,但忘了回來,drowe的解決方案無論如何都是現貨。 – CodingDuckling

+0

你在哪裏下載SDK?我一直在試圖找到它沒有用。 – Ares

回答

9

這就是我與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"); 
    } 
} 
+0

Hi @drowe。我有一個UniMag閱讀器,但我沒有最新的SDK ...你知道我是否運行沒有行的項目:myUniMagReader.setXMLFileNameWithPath(null);和 myUniMagReader.loadingConfigurationXMLFile(true);將變得不可能使它工作? 我試過了,儘管myUniMagReader.getIsToSwipeCard()是「true」,但是當我刷卡時處理程序不會收到任何數據......讀卡器與UniMagIIDemo應用程序完美配合。 – Devester

+0

上面的代碼是否工作?其實我正在使用Unimag 2作爲刷卡器的項目。我有它的SDK和演示,但你知道演示應用程序非常複雜。而主要的是客戶還沒有給我發送unimag swiper。他要求在沒有sw make的情況下進行演示。這就是爲什麼我需要一個Unimag 2閱讀器的簡單工作示例。任何幫助? –

+0

上面的代碼工作就像一個魅力... –

1

我發現他們與SDK附帶的3.8演示應用程序有一個錯誤,它不會連接到Android的GT-P3113平板電腦,除非你進入設置在手機上的應用程序,並關閉「命令連接'。

+0

是的,來自Unimag的SDK在這裏和那裏有一些錯誤,必須小心並小心。 – CodingDuckling