Android 完整代码实现门禁卡写入SE卡
时间: 2023-08-05 14:12:29 浏览: 299
要实现门禁卡写入SE卡,需要用到NFC和SE API。以下是一个Android应用程序的完整代码实现。
首先,需要声明需要的权限和服务:
```xml
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
<uses-feature android:name="android.hardware.nfc" android:required="true"/>
<uses-feature android:name="android.hardware.nfc.hce" android:required="true"/>
<service
android:name=".HostApduService"
android:permission="android.permission.BIND_NFC_SERVICE">
<intent-filter>
<action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<meta-data android:name="android.nfc.cardemulation.host_apdu_service"
android:resource="@xml/apduservice"/>
</service>
```
在这个应用中,我们使用了HostApduService,一个可以在SE卡上运行的服务。在AndroidManifest.xml中声明了这个服务,并添加了相应的权限和意图过滤器。
接下来,创建`apduservice.xml`文件:
```xml
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/service_description"
android:requireDeviceUnlock="false">
<aid-group android:description="@string/aid_description"
android:category="other">
<aid-filter android:name="F0010203040506" />
<aid-filter android:name="F0394148148100" />
</aid-group>
</host-apdu-service>
```
这个文件定义了应用可以处理的AID列表。在这个例子中,我们定义了两个AID:F0010203040506和F0394148148100。
接下来,创建一个HostApduService:
```java
public class HostApduService extends android.nfc.cardemulation.HostApduService {
private static final String TAG = "HostApduService";
private static final String SAMPLE_LOYALTY_CARD_AID = "F0010203040506";
private static final byte[] SELECT_OK_SW = HexStringToByteArray("9000");
private static final byte[] UNKNOWN_CMD_SW = HexStringToByteArray("0000");
private static final byte[] SELECT_APDU = BuildSelectApdu(SAMPLE_LOYALTY_CARD_AID);
private static byte[] BuildSelectApdu(String aid) {
return HexStringToByteArray("00A40400" + String.format("%02X", aid.length() / 2) + aid);
}
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;
}
@Override
public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
if (Arrays.equals(SELECT_APDU, commandApdu)) {
Log.i(TAG, "Application selected");
return SELECT_OK_SW;
} else {
return UNKNOWN_CMD_SW;
}
}
@Override
public void onDeactivated(int reason) {
Log.i(TAG, "Deactivated: " + reason);
}
}
```
这个HostApduService的作用是在SE卡上运行,处理来自读卡器的APDU命令。在这个例子中,我们只处理SELECT APDU命令,忽略其他命令。
最后,启动应用程序并将门禁卡放在手机的NFC读卡器上。如果一切正常,应用程序应该能够检测到卡片,并将其写入SE卡中。
请注意,这个应用程序只是一个演示,实际的门禁系统需要更加复杂的逻辑和安全措施。
阅读全文
相关推荐













