2017-06-08 3 views

Antwort

0

Leider gibt es keine Abstraktionsschicht wie PC/SC im nativen Android-System ist. Aber Sie können Android USB library verwenden, um direkt mit dem USB-Chipkartenleser zu sprechen.

+0

Eigentlich muss ich den Kartenleser direkt über USB an das Telefon anschließen, weil ich keinen PC oder etwas anderes habe, nur das Android-Handy und den Kartenleser. –

+0

Und auch ich muss Telefone unterstützen, die keine NFC haben –

+0

Warten Sie, Sie meinen also, Sie möchten einen USB-Chipkartenleser an ein Android-Handy anschließen? – arminb

0

In Java findet die Kommunikation mit dem Paket javax.smarcard statt, das für Android nicht verfügbar ist, also nehmen Sie eine look here, um eine Idee zu bekommen, wie Sie APDU (Smartcard-Befehl) kommunizieren oder senden/empfangen können.

die USB-Host-API verbinden: :

//Allows you to enumerate and communicate with connected USB devices. 
UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 
//Explicitly asking for permission 
final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; 
PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); 
HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList(); 

UsbDevice device = deviceList.get("//the device you want to work with"); 
if (device != null) { 
    mUsbManager.requestPermission(device, mPermissionIntent); 
} 

Und jetzt werden Sie Endpunkte benötigen, einfach eine APDU (Smartcard-Befehl) über die Masse-out-Endpunkt senden und erwarten eine Antwort APDU über erhalten der Bulk-In-Endpunkt.

-Code-Endpunkte erhalten ::

UsbEndpoint epOut = null, epIn = null; 
UsbInterface usbInterface; 

UsbDeviceConnection connection = mUsbManager.openDevice(device); 

    for (int i = 0; i < device.getInterfaceCount(); i++) { 
     usbInterface = device.getInterface(i); 
     connection.claimInterface(usbInterface, true); 

     for (int j = 0; j < usbInterface.getEndpointCount(); j++) { 
      UsbEndpoint ep = usbInterface.getEndpoint(j); 

      if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { 
       if (ep.getDirection() == UsbConstants.USB_DIR_OUT) { 
        // from host to device 
        epOut = ep; 

       } else if (ep.getDirection() == UsbConstants.USB_DIR_IN) { 
        // from device to host 
        epIn = ep; 
       } 
      } 
     } 
    } 

Befehle diese verwenden zu verschicken:

public void write(UsbDeviceConnection connection, UsbEndpoint epOut, byte[] command) { 
result = new StringBuilder(); 
connection.bulkTransfer(epOut, command, command.length, TIMEOUT); 
//For Printing logs you can use result variable 
for (byte bb : command) { 
    result.append(String.format(" %02X ", bb)); 
} 
} 

Und Daten lesen oder binär lesen Sie diesen Code verwenden können senden:

public int read(UsbDeviceConnection connection, UsbEndpoint epIn) { 
result = new StringBuilder(); 
final byte[] buffer = new byte[epIn.getMaxPacketSize()]; 
int byteCount = 0; 
byteCount = connection.bulkTransfer(epIn, buffer, buffer.length, TIMEOUT); 
//For Printing logs you can use result variable 
if (byteCount >= 0) { 
    for (byte bb : buffer) { 
     result.append(String.format(" %02X ", bb)); 
    } 

    //Buffer received was : result.toString() 
} else { 
    //Something went wrong as count was : " + byteCount 
} 

return byteCount; 
} 

Jetzt nehmen wir ein Beispiel für diesen Befehl wie hier: 62000000000000000000 Wie Sie das senden können, ist:

write(connection, epOut, "62000000000000000000"); 

Jetzt, nachdem Sie erfolgreich den APDU-Befehl gesendet haben, können Sie die Antwort unter Verwendung lesen:

read(connection, epIn); 

Und wie

etwas erhalten
80 18000000 00 00 00 00 00 3BBF11008131FE45455041000000000000000000000000F1 

nun die Antwort in den Code erhalten hier wird in der Ergebnisvariable read() method.And ebenso können Sie Ihre eigenen Befehle für die Kommunikation schreiben.