2012-08-22 17 views
11

Tôi đã làm việc trên Android (v2.3) cho một vài tuần nay, và tôi đã vấp phải một số vấn đề với Unimag Thẻ Swiper từ IDTECH.IDTech Unimag Thẻ Swiper trên Android

Đơn vị đi kèm với tài liệu khan hiếm và ứng dụng demo từ SDK triển khai bản cập nhật chương trình cơ sở và một vài lớp cho hộp thoại và thực sự làm cách nào để đạt được chức năng cơ bản (thêm vào số ít và không có ý kiến ​​hay trong mã).

Tôi đã triển khai giao diện trong hoạt động cơ bản và cố gắng phát hiện khi thiết bị được kết nối hoặc ngắt kết nối nhưng dường như người nghe bắt cả hai sự kiện (kết nối/ngắt kết nối) là "ngắt kết nối", hãy để một mình cố gắng đọc thẻ.

Có ai đã làm việc với đơn vị này trên Android và có một số ví dụ rõ ràng không?

Bằng cách này, đây là lớp học của tôi:

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; 
    } 
} 

(Có một số phương pháp chưa thực hiện có cũng)

+0

Bạn đã sửa lỗi này bằng cách này chưa? – dariopy

+0

Vâng, tôi đã làm, kiểm tra bình luận của tôi dưới đây về giải pháp. Tôi đã giải quyết nó từ lâu nhưng quên quay trở lại, giải pháp của drowe là tại chỗ trên anyway. – CodingDuckling

+0

Bạn đã tải xuống SDK ở đâu? Tôi đã cố gắng tìm nó mà không có kết quả. – Ares

Trả lời

9

Đây là những gì tôi đã sử dụng với UniMag. Sử dụng trình xử lý để xuất dữ liệu được vuốt và nút 'Vuốt' để bắt đầu vuốt. Để cải thiện, người ta nên đợi cho đến khi đầu đọc thẻ báo cáo nó được kết nối/sẵn sàng để vuốt, sau đó kích hoạt nút, tắt trong khi chờ vuốt và bật lại sau khi nhận dữ liệu.

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

Xin chào @drowe. Tôi đã có một đầu đọc UniMag, nhưng tôi không có SDK mới nhất ... Bạn có biết nếu tôi chạy dự án mà không có các dòng: myUniMagReader.setXMLFileNameWithPath (null); và myUniMagReader.loadingConfigurationXMLFile (true); sẽ trở thành không thể làm cho nó hoạt động? Tôi đã thử và mặc dù myUniMagReader.getIsToSwipeCard() là "true", trình xử lý không nhận được bất kỳ dữ liệu nào khi tôi vuốt thẻ ... Trình đọc hoạt động hoàn hảo với ứng dụng UniMagIIDemo. – Devester

+0

Mã trên có hoạt động không? Trên thực tế tôi đang làm việc trên một dự án sử dụng Unimag 2 như swiper thẻ.Tôi có SDK và bản demo nhưng như bạn biết ứng dụng demo rất phức tạp. Và điều chính là khách hàng chưa gửi cho tôi chiếc máy quét chưa chải kỹ nào. Anh ta yêu cầu làm một bản demo mà không cần phải dùng đến. Đó là lý do tại sao tôi cần một ví dụ làm việc đơn giản của trình đọc Unimag 2. Bất kỳ giúp đỡ? –

+0

mã trên hoạt động như một nét duyên dáng ... –

1

tôi thấy rằng các ứng dụng 3.8 bản demo họ tàu với SDK có một lỗi nơi nó sẽ không kết nối với một máy tính bảng gt-p3113 Android trừ khi bạn đi vào cài đặt trên ứng dụng trên điện thoại và tắt 'Command Kết nối'.

+0

Vâng, SDK từ Unimag có một vài lỗi ở đây và ở đó, người ta phải cẩn thận và xem ra. – CodingDuckling

Các vấn đề liên quan