在安卓开发中,读取刷卡数据通常涉及以下两类场景:
在AndroidManifest.xml
中添加NFC权限:
<uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="true" />
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null) { // 设备不支持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); }
在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); // 进一步解析数据 } } }
在AndroidManifest.xml
中声明USB设备过滤:
<usb-devicevendor-id="0xXXXX" product-id="0xXXXX"/>
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端点并读取数据 } }
InputStream inputStream = connection.getInputStream(); byte[] buffer = new byte[1024]; int length = inputStream.read(buffer); // 解析磁道数据(如ISO 7813格式)
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();
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二进制)。 |
解答:
通过NfcAdapter.getDefaultAdapter(context)
获取适配器,若返回null
则表示设备不支持NFC,代码示例:
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null) { // 设备不支持NFC } else { // 支持NFC }
解答: