上一篇
安卓开发怎么读取刷卡数据
- 行业动态
- 2025-04-22
- 9
刷卡数据读取的常见场景
在安卓开发中,读取刷卡数据通常涉及以下两类场景:
- NFC(近场通信)刷卡:如读取银行卡、门禁卡、公交卡等IC卡数据。
- 外接刷卡器:通过USB或蓝牙连接磁条卡读卡器、IC卡读卡器等设备。
NFC刷卡数据读取
权限配置
在AndroidManifest.xml
中添加NFC权限:
<uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="true" />
初始化NFC适配器
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null) { // 设备不支持NFC }
捕获NFC标签数据
在onResume()
中启用前台调度系统:
@Override protected void onResume() { super.onResume(); IntentFilter[] filters = new IntentFilter[]{new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED)}; nfcAdapter.enableForegroundDispatch(this, pendingIntent, filters, null); } @Override protected void onPause() { super.onPause(); nfcAdapter.disableForegroundDispatch(this); }
处理NFC意图
在onNewIntent()
中解析标签数据:
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) { Parcelable tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if (tag != null) { // 读取ISO 14443 Card数据(示例) byte[] id = tag.getByteArrayExtra(Ndef.EXTRA_ID); // 进一步解析数据 } } }
外接刷卡器数据读取
USB刷卡器读取
(1) 配置USB权限
在AndroidManifest.xml
中声明USB设备过滤:
<usb-devicevendor-id="0xXXXX" product-id="0xXXXX"/>
(2) 检测并请求权限
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList(); for (UsbDevice device : deviceList.values()) { if (device.getVendorId() == 0xXXXX && device.getProductId() == 0xXXXX) { UsbDeviceConnection connection = usbManager.openDevice(device); // 配置USB端点并读取数据 } }
(3) 通过输入流读取数据
InputStream inputStream = connection.getInputStream(); byte[] buffer = new byte[1024]; int length = inputStream.read(buffer); // 解析磁道数据(如ISO 7813格式)
蓝牙刷卡器读取
(1) 绑定蓝牙设备
BluetoothDevice device = bluetoothAdapter.getRemoteDevice("XX:XX:XX:XX:XX:XX"); BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); socket.connect(); InputStream inputStream = socket.getInputStream();
(2) 读取并解析数据
byte[] buffer = new byte[1024]; int length = inputStream.read(buffer); // 解析数据(如磁条卡的Track1/Track2格式)
数据解析与处理
数据类型 | 解析方式 |
---|---|
磁条卡 | 按ISO 7813标准解析,包含Track1(编码信息)、Track2(金融数据)、Track3(加密数据)。 |
IC卡(NFC) | 通过Tag 对象读取块数据,或解析NDEF消息。 |
CPU卡 | 需通过APDU命令与卡片交互(如SELECT文件、READ二进制)。 |
注意事项
- 权限问题:外接设备需动态请求USB/蓝牙权限(Android 6.0+)。
- 安全性:避免存储敏感数据(如银行卡CVV码),建议直接上传至服务器。
- 兼容性:不同厂商的刷卡器协议可能不同,需参考设备文档或SDK。
- NFC限制:部分安卓设备仅支持特定类型的NFC标签(如MIFARE Classic)。
相关问题与解答
问题1:如何判断设备是否支持NFC?
解答:
通过NfcAdapter.getDefaultAdapter(context)
获取适配器,若返回null
则表示设备不支持NFC,代码示例:
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null) { // 设备不支持NFC } else { // 支持NFC }
问题2:外接刷卡器如何保证兼容性?
解答:
- 遵循标准协议:优先选择支持ISO 7816(IC卡)或ISO 7813(磁条卡)的设备。
- 使用厂商SDK:部分刷卡器厂商提供安卓SDK(如SZZT、新大陆等),可直接调用接口。
- 测试多品牌设备:因硬件差异,需测试不同型号的安卓设备与刷卡器的兼容性