无法使用javax.smartcardio.CardTerminal connect()方法连接Android HCE

时间:2014-09-16 06:33:18

标签: java android smartcard hce acr122

现在我正构建一个简单的应用程序,使用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文件,并且它正在工作,所以我怀疑这是手机问题

1 个答案:

答案 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>