android HCE demo
时间: 2023-07-22 16:44:16 浏览: 176
好的,以下是一个简单的 Android HCE(Host Card Emulation)演示示例:
1. 在 Android Studio 中创建一个新项目。
2. 在项目的 `AndroidManifest.xml` 文件中添加以下权限:
```xml
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc.hce" android:required="true" />
```
3. 在 `AndroidManifest.xml` 文件中添加一个 `<service>` 元素,以指定要使用的 HCE 服务:
```xml
<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>
```
4. 在 `res/xml` 目录中创建一个名为 `apduservice.xml` 的新文件,以指定 HCE 服务的 AID(应用程序标识符):
```xml
<?xml version="1.0" encoding="utf-8"?>
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/service_description"
android:requireDeviceUnlock="false">
<aid-group
android:category="other"
android:description="@string/aid_description">
<aid-filter android:name="F0010203040506" />
</aid-group>
</host-apdu-service>
```
5. 创建一个名为 `MyHostApduService.java` 的新类,并使其扩展 `HostApduService` 类。在此类中,您可以添加逻辑来处理收到的 APDU(应用程序协议数据单元)命令:
```java
public class MyHostApduService extends HostApduService {
private static final String TAG = "MyHostApduService";
private static final String SELECT_APDU_HEADER = "00A40400";
private static final String SELECT_APDU_BODY = "F0010203040506";
private static final byte[] SELECT_OK_SW = HexStringToByteArray("9000");
private static final byte[] UNKNOWN_CMD_SW = HexStringToByteArray("0000");
@Override
public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
Log.d(TAG, "Received APDU: " + ByteArrayToHexString(apdu));
if (Arrays.equals(apdu, BuildSelectApdu(SELECT_APDU_HEADER, SELECT_APDU_BODY))) {
Log.d(TAG, "Application selected");
return SELECT_OK_SW;
} else {
return UNKNOWN_CMD_SW;
}
}
@Override
public void onDeactivated(int reason) {
Log.d(TAG, "Deactivated: " + reason);
}
private static byte[] BuildSelectApdu(String header, String body) {
return HexStringToByteArray(header + String.format("%02X", body.length() / 2) + body);
}
private static byte[] HexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16));
}
return data;
}
private static String ByteArrayToHexString(byte[] bytes) {
final StringBuilder builder = new StringBuilder();
for (byte b : bytes) {
builder.append(String.format("%02X", b));
}
return builder.toString();
}
}
```
6. 运行应用程序,并将设备放在支持 HCE 的 NFC 读卡器上。此时,您的应用程序将模拟一张智能卡,并根据收到的 APDU 命令返回响应。
请注意,这只是一个简单的演示示例,实际上在使用 HCE 技术时,您需要考虑更多的安全和性能问题。
阅读全文