HCE不在Nexus 5以外的其他手机上工作

时间:2014-09-25 09:28:56

标签: android nfc hce

我目前正在尝试使用Android上的HCE与设备进行通信。我创建了自己的NFC服务,扩展了HostApduService类,在AndroidManifest.xml中声明了NFC部分,并创建了指定AID的apduservice.xml

当我在Nexus4或Nexus 5(4.4.4)设备上运行我的应用程序时,所有工作都按预期工作(!),我从设备接收APDU数组并发回答案,然后继续使用专有协议。所以似乎上面的配置部分已正确设置。

然而,当我在 Sony Xperia Z2(4.4.2)三星Galaxy S5(4.4.2) Motorola上部署我的应用程序时Moto X(4.4.3) processCommandApdu()中的代码甚至没有被称为。该方法的第一行包含一个我根本看不到的日志输出。

根据编译的列表here,我的设备应该支持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 OS源代码中设置断点,例如HostApduService.java?我可以打开文件并查看代码但设置断点没有任何效果,至少在视觉上它没有显示,在调试模式下运行时,它也不会在那个地方中断。

我猜想当android应该选择与指定AID相对应的应用程序时会发生一些事情。我的问题与this one有些相关,但答案与付款有关,这对我没什么帮助。

为什么我无法在其他设备上运行它?提前谢谢。

3 个答案:

答案 0 :(得分:4)

同时我找出了问题的根源。按照Michael Roland的建议,我试图找出读者发送的APDU命令。我测试了我的应用程序与我可以得到的所有Android手机,并发现所有具有NFC控制器的手机由恩智浦表示无法正常工作。

  • 工作:Nexus 4,5,7 G2,10(Broadcom芯片)
  • 无法正常工作:Nexus S,Nexus 7 G1,三星Galaxy S5,索尼Xperia Z2,摩托罗拉Moto X(恩智浦芯片)

原因是NXP芯片发送的随机ID不符合我的读者所期望的标准(如here所述)。 它应该按照这个看:

0x08, A, B, C

其中A,B和C是随机的。但是NXP芯片发送的ID在哪里常数

0x1, 0x2, 0x3, 0x4

或者在第一个0x08之后有7个字节是随机的,而不是仅仅是3个字节。

这导致读者发送一个没有使用android触发器的APDU来调用我的processCommandApdu()方法。

答案 1 :(得分:1)

错误

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 HCE实现要求应用程序选择命令使P2等于0x00(表示选择&#34;首先或仅出现所选AID / DF名称的#34;)。请参阅HostEmulationManager.java:437

因此,您需要确保阅读器端正在发送适当的命令以供应用程序选择。

答案 2 :(得分:0)

问题是由于某种原因导致棒棒糖不支持发送的APDU中的卡标识符或CID。因此,当阅读器发送带有CID的下一个命令时,手机将禁用该命令并保持接收模式。因此,这需要在没有CID的情况下发送APDU命令。解决方法是联系设备制造商以支持不需要CID的卡,如@SOERGI所说。