我目前正在尝试与一个在android上使用HCE的设备进行通信。我已经创建了自己的NFC服务,它扩展了HostApduService类,在AndroidManifest.xml中声明了NFC部分,并创建了指定艾滋病的apduservice.xml。
当我在Nexus4或Nexus 5 (4.4.4)设备上运行我的应用程序时,所有的工作原理都与预期的(!)一样,我从设备接收APDU数组并发送回一个答案,然后继续使用固有协议。因此,上述配置部分的设置似乎是正确的。
然而,当我在索尼Xperia Z2 (4.4.2)、三星Galaxy S5 (4.4.2)或摩托罗拉Moto (4.4.3)上部署我的应用程序时,我的processCommandApdu()代码甚至都没有被调用。该方法的第一行包含一个日志输出,我完全看不到。
根据已编译的这里列表,我的设备应该支持HCE。
当我点击设备前面的(不工作的)手机时,我得到了以下日志输出,但我似乎找不到错误代码的确切含义:
D/STATUSBAR-NetworkController(1085): refreshSignalCluster - setNWBoosterIndicators(false)
D/STATUSBAR-NetworkController(1085): refreshSignalCluster: data=-1 bt=false
D/STATUSBAR-IconMerger(1085): checkOverflow(504), More:false, Req:false Child:6
D/HostEmulationManager(1277): notifyHostEmulationActivated
D/HostEmulationManager(1277): notifyHostEmulationData
D/HostEmulationManager(1277): call findSelectAid - 1
D/HostEmulationManager(1277): Selecting next, last or previous AID occurrence is not supported
D/NfcService(1277): onSeListenDeactivated - Skip this one, user select the onHost apk temporarily
D/HostEmulationManager(1277): notifyHostEmulationDeactivated
E/NfcNfa(1277): UICC/ESE[0x402] is not activated在哪里可以查找错误代码0x402
这里是apduservice.xml
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/service_desc"
android:requireDeviceUnlock="false">
<aid-group android:description="@string/aid_description"
android:category="other">
<aid-filter android:name="F04B4142413134" />
<aid-filter android:name="F0404B75737469"/>
</aid-group>
</host-apdu-service>我在Nexus 5中接收到的APDU命令如下所示,在我看来,它似乎遵循APDU规范来选择应用程序:
output: [00, a4, 04, 00, 07, f0, 4b, 41, 42, 41, 31, 34]
00 -> class
a4 -> instruction select
04 -> P1, select by name
00 -> P2
07 -> length of the following aid
rest -> corresponds to the first aid-filter奖金问题:
如何在android源代码中设置断点,例如在HostApduService.java中?我可以打开文件并查看代码,但是设置断点不会产生任何效果,至少在视觉上没有显示,在调试模式下运行时,也不会在那个位置中断。
我猜想,当android应该选择与指定的AID相对应的应用程序时,会发生一些事情。我的问题有点与这一个有关,但答案与付款有关,但对我没有多大帮助。
知道为什么我不能在其他设备上运行吗?提前谢谢。
发布于 2014-10-03 13:43:48
与此同时,我找出了问题的根源。按照Michael的建议,我试图找出读者发送的APDU命令。我用我所有的android手机测试了我的应用程序,发现所有有NFC控制器的手机都是NXP不工作的。
原因是NXP芯片发送的随机ID不符合我的读者所期望的标准(如这里所描述的)。它应该根据这一点来看:
0x08, A, B, C其中A,B和C是随机的。但是NXP芯片发送的ID中的任何一个常量
0x1, 0x2, 0x3, 0x4或者,在第一个0x08之后有7个字节是随机的,而不是只有3个字节。
这使得阅读器发送了一个APDU,它没有使Android触发器调用我的processCommandApdu()方法。
发布于 2014-09-30 06:56:54
误差
E/NfcNfa(1277): UICC/ESE[0x402] is not activated在您的情况下并不是真正的相关错误。重要的信息是
D/HostEmulationManager(1277): Selecting next, last or previous AID occurrence is not supported这清楚地表明SELECT (按DF /AID)命令的P2字节不等于0x00。当前的Android实现要求应用程序选择命令的P2等于0x00 (指示选择所选AID/DF名称的“第一次或唯一发生”)。见HostEmulationManager.java:437。
因此,您需要确保读取器端为应用程序选择发送了适当的命令。
发布于 2015-09-24 23:04:08
造成此问题的原因是,由于某种原因,棒棒糖在发送的APDU中不支持卡标识符或CID。因此,当读取器用CID发送下一个命令时,电话将禁用该命令并保持接收模式。因此,这需要发送APDU命令而不需要CID。工作是联系设备制造商,支持不需要CID的卡,如@SOERGI所说。
https://stackoverflow.com/questions/26035044
复制相似问题