现在我正构建一个简单的应用程序,使用Android HCE(基于主机的卡仿真)模拟智能卡。应用程序仅为其收到的每个APDU命令返回{90,00}字节数组。这是代码:
public class MyHostApduService extends HostApduService {
@Override
public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
byte[] response = new byte[2];
response[0] = (byte)0x90;
response[1] = 0x00;
return response;
}
//Rest of the code...
}
然后我尝试使用来自javax.smartcardio.CardTerminal的CardTerminal.connect()方法将我的智能手机(我使用Sony Xperia M2)连接到智能卡读卡器(ACR122U-A9)
Card card = terminal.connect("*");
它适用于真正的智能卡,但它并不想连接我的手机。发出哔哔声,但LED关闭(它没有像检测到真正的智能卡那样变绿),当我取下智能手机时,我收到了CardException,LED指示灯变回红色。有时读者看起来像连接到手机(LED变为绿色),但手机似乎没有接收到APDU。我还尝试使用springcard的scScriptor.exe进行连接,结果相同。
代码中是否有我遗漏的东西?或者可能是技术问题?
编辑:我在我朋友的Galaxy s iii上安装了apk文件,并且它正在工作,所以我怀疑这是手机问题答案 0 :(得分:1)
如果我理解这一点并且您的问题出在Android客户端上,那么您可能错过了在Manifest和xml文件中为您的应用程序定义正确的AID (另见https://developer.android.com/guide/topics/connectivity/nfc/hce.html) 您可能也只是注册了错误的AID - 记录您的apdu命令以查看读者可能会选择哪种帮助。
AndroidManifest:
<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(在aid-filter标签中填写您的AID):
<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="F0010203040506"/>
<aid-filter android:name="F0394148148100"/>
</aid-group>
</host-apdu-service>