基于USB的Android智能卡接口

基于USB的Android智能卡接口,android,usb,smartcard,Android,Usb,Smartcard,我需要使用通过USB连接到Android手机的智能卡读卡器读/写智能卡。 对于本机API,这是可能的,还是必须安装其他库 谢谢遗憾的是,在本机Android系统中没有像PC/SC这样的抽象层。但是您可以利用它直接与USB智能卡读卡器通话。遗憾的是,在本机Android系统中没有像PC/SC这样的抽象层。但是,您可以利用它直接与USB智能卡读卡器通信。在java中,通信使用的是不适用于Android的packagejavax.smarcard,因此请了解如何通信或发送/接收APDU(智能卡命令)

我需要使用通过USB连接到Android手机的智能卡读卡器读/写智能卡。 对于本机API,这是可能的,还是必须安装其他库


谢谢

遗憾的是,在本机Android系统中没有像PC/SC这样的抽象层。但是您可以利用它直接与USB智能卡读卡器通话。

遗憾的是,在本机Android系统中没有像PC/SC这样的抽象层。但是,您可以利用它直接与USB智能卡读卡器通信。

在java中,通信使用的是不适用于Android的package
javax.smarcard
,因此请了解如何通信或发送/接收APDU(智能卡命令)

使用USB主机API连接: :

要读取数据或发送二进制读取,可以使用以下代码:

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;
}
现在让我们举一个类似于此处的命令的示例:
620000000000000000000000000
如何发送此命令:

write(connection, epOut, "62000000000000000000");
现在,在成功发送APDU命令后,可以使用以下命令读取响应:

read(connection, epIn);
然后收到类似于

80 18000000 00 00 00 00 00 3BBF11008131FE45455041000000000000000000000000F1

现在,在这里的代码中收到的响应将出现在
read()的结果变量中
方法。同样,您也可以编写自己的通信命令。

在java中,通信使用的是不适用于Android的package
javax.smarcard
,因此请仔细了解如何通信或发送/接收APDU(智能卡命令)

使用USB主机API连接: :

要读取数据或发送二进制读取,可以使用以下代码:

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;
}
现在让我们举一个类似于此处的命令的示例:
620000000000000000000000000
如何发送此命令:

write(connection, epOut, "62000000000000000000");
现在,在成功发送APDU命令后,可以使用以下命令读取响应:

read(connection, epIn);
然后收到类似于

80 18000000 00 00 00 00 00 3BBF11008131FE45455041000000000000000000000000F1

现在,在这里的代码中收到的响应将在
read()
方法的结果变量中。同样,您可以编写自己的通信命令。

实际上,我需要通过USB将读卡器直接连接到手机上,因为我没有PC或其他任何东西,jsut安卓手机和读卡器。我还需要支持没有NFCWait的手机,所以你的意思是你想将USB智能读卡器连接到安卓手机?是的。SC&Droid有一个应用程序支持这一点,但他们不提供代码,但由于智能读卡器设备主要属于CCID USB类,我是否必须通过UBS库实现此协议?实际上,我需要通过USB将读卡器直接连接到手机上,因为我没有PC或其他任何东西,jsut安卓手机和读卡器。我还需要支持没有NFCWait的手机,所以你的意思是你想将USB智能读卡器连接到安卓手机?是的。SC&Droid有一个应用程序支持这一点,但他们不提供代码,但由于智能卡读卡器设备主要属于CCID USB类,我是否必须通过UBS库实现此协议?