我创建了一个AID为F0123412349999的HCE服务。根据Android HCE文档,我需要发送SELECT APDU,以便HCE服务知道将以下消息重定向到哪个服务。这是我成功连接时发送到手机的APDU:
{ 0x00, //CLA
0xA4, //INS
0x00, //P1
0x07, //P2
0x07, //Lc Length Content
0xF0, //Data (AID)
0x12,
0x34,
0x12,
0x34,
0x99,
0x99,
0x00 //Length of data expected
};
传输成功,但我做的Android手机返回0x6f00。这被翻译为" No Precise Diagnosis"。我不知道出了什么问题,显然错误信息有些模糊。以下代码是我的HCE服务:
public class MyHostApduService extends HostApduService {
@Override
public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
Log.i("HCE service", "processCommandApdu");
byte[] answer = new byte[2];
answer[0] = (byte) 0x90;
answer[1] = (byte) 0x00;
return answer;
}
@Override
public void onDeactivated(int reason) {
Log.i("HCE service", "Deactivated: " + reason);
}
@Override
public void onCreate() {
Log.i("HCE service", "Created");
}
}
和AID注册:
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/app_name"
android:requireDeviceUnlock="false" >
<aid-group
android:category="other"
android:description="@string/app_name" >
<aid-filter android:name="F0123412349999" />
<aid-filter android:name="F0394148148100" />
</aid-group>
</host-apdu-service>
清单注册:
<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>
我用来阅读Android手机的读者是ACR122阅读器。手机是HTC One。让我感到奇怪的一件事是手机发送的ATR与读卡器发送的是0x3B80800101。我虽然这会更大并且包含更多信息,但我可能错了。
我可以更改/修复什么来让Android将我的消息发送到我的HCE服务?
答案 0 :(得分:2)
您要发送到手机的SELECT APDU中参数P1和P2的值可能无效。 请尝试以下方法:
P1 = 0x04
P2 = 0x00
您可以在由行业协会Global Platform发布的名为“Card Specification”的文档中检查SELECT命令的所有参数。