我想向用户显示公交卡的ID(IsoDep,NfcB),以及我使用以下guide成功完成的操作。
现在,我尝试使用以下guide模拟主机卡模拟卡。
我使用以下代码创建了一个名为MyHosApduService.java
的新类:
public class MyHostApduService extends HostApduService {
@Override
public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
...
}
@Override
public void onDeactivated(int reason) {
...
}
}
使用以下代码在AndroidManifest.xml
声明服务:
<service android:name=".MyHostApduService" android:exported="true"
android:permission="android.permission.BIND_NFC_SERVICE">
<intent-filter>
<action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
</intent-filter>
<meta-data android:name="android.nfc.cardemulation.host_apdu_service"
android:resource="@xml/apduservice"/>
</service>
并apduservice.xml
使用以下代码:
<?xml version="1.0" encoding="utf-8"?>
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/servicedesc"
android:requireDeviceUnlock="false">
<aid-group android:description="@string/aiddescription"
android:category="other">
<aid-filter android:name="0x00DDA611"/>
</aid-group>
</host-apdu-service>
从这里开始,如何将正确的数据发送到服务并正确触发服务?
答案 0 :(得分:0)
您在AID过滤器中选择并注册的AID无效。 AID值必须由十六进制数字组成,不带“0x”前缀。超过它必须包含至少5个字节和最多16个字节。 AID的有效格式在ISO / IEC 7816-4中定义。有关详细信息,请参阅this answer。
请注意您通过
获取的ID(防冲突标识符/标签标识符/ UID /等)byte[] id = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
或
byte[] id = tag.getId();
不是智能卡应用程序标识符(AID)。 Android HCE不允许您选择该ID。相反,您只能模拟由AID标识的智能卡应用程序。这意味着智能卡读卡器将通过发出与您的应用程序的名称(即AID)匹配的SELECT命令来搜索手机上的特定HCE应用程序。
因此,您首先需要为您的应用选择有效的AID,例如: F0112233445566
。在阅读器方面,您可以发送SELECT APDU来寻址您的应用程序
00 A4 04 00 07 F0112233445566 00
您可能还想阅读