1
A
回答
0
可悲的是沒有像原生的Android系統PC/SC
沒有抽象層。但是您可以使用Android USB library直接與USB智能卡讀卡器對話。
0
在java中,通信是使用包不可用於Android的包javax.smarcard
進行的,因此需要look here瞭解如何通信或發送/接收APDU(智能卡命令)。
使用USB主機API連接: :
//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);
}
那麼現在就需要終端,只需在批量出端點發送APDU(智能卡命令),並期望在收到響應APDU大容量端點。
代碼來獲得端點::
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;
}
}
}
}
發送命令使用:
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));
}
}
並讀取數據或發送二進制讀取,你可以使用此代碼:
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;
}
現在讓我們來看看這個命令的例子:62000000000000000000
如何發送這個命令是:
write(connection, epOut, "62000000000000000000");
現在您已成功發送的APDU命令後,您可以使用讀取響應:
read(connection, epIn);
和接收像
80 18000000 00 00 00 00 00 3BBF11008131FE45455041000000000000000000000000F1
現在的代碼在這裏獲得響應將在read()
方法的結果變量中。同樣,您可以編寫自己的通信命令。
相關問題
- 1. 通過WiFi或USB在Android上的智能卡讀卡器
- 2. iOS智能卡接口
- 3. 在我的項目中通過USB通過USB連接一個arduino到一個ANDROID手機通過USB端口
- 4. 通過java腳本連接到智能卡讀卡器
- 5. 智能卡USB驅動器號
- 6. 智能卡和Android
- 7. 驗證窗口通過智能卡登錄
- 8. 通過串行連接從智能卡讀卡器接收數據(C#)
- 9. 連接到智能卡
- 10. 通過USB連接到Android設備
- 11. 通過USB從Android連接到主機
- 12. Android - 通過USB連接多臺設備
- 13. 通過USB在窗口
- 14. Android ADB USB接口類型
- 15. 通過USB發送的Android
- 16. 通過USB的Android信息
- 17. Java智能卡 - 讀Scosta智能卡
- 18. 通過USB連接的APDU
- 19. 用USB證書加密的Java(智能卡)
- 20. 如何通過MATLAB通信USB端口?
- 21. 與協議t1的智能卡通信
- 22. C++ windows通過USB串口獲取USB端口和集線器
- 23. 我如何找到通過USB連接的我的android設備的端口號?
- 24. 通過usb與android和串口設備進行通信
- 25. 通過Android中的USB連接與PC進行通信
- 26. 如何在沒有USB連接的情況下與Android設備進行通信。可能通過串行端口
- 27. 通過沒有pkcs11的智能卡在java中籤署文檔
- 28. 如何通過PHP使用我的serverside智能卡?
- 29. 通過Android應用程序發送和接收USB端口上的數據
- 30. RDC通過智能手機
其實我需要通過USB直接將讀卡器連接到手機,因爲我不會有電腦或其他任何東西,只需安卓手機和讀卡器即可。 –
而且我還需要支持沒有NFC的手機 –
請等待,因此您的意思是您想要將USB智能卡讀卡器連接到Android手機? – arminb