【发布时间】:2021-05-11 05:29:39
【问题描述】:
我正在开发一个创建 NFC 卡 ID 的 Android 应用程序。我可以通过电话从扫描的 NFC 卡中获取信息。但我无法用我的应用程序创建它们。首先,我尝试使用this method 来做到这一点。然后,我意识到需要有 Tag 对象并尝试以不同的方式保存它。虽然没用。
其次,我从 android 文档中找到了this。然后,我尝试使用HostNfcFService 和HostApduService。为了使用它们,我创建了如下的 XML 文件和服务类;
nfcfservice.xml:
<!--HostNfcFService XML-->
<host-nfcf-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="NFCService">
<system-code-filter android:name="4000"/>
<nfcid2-filter android:name="02FE000000000000"/>
<t3tPmm-filter android:name="FFFFFFFFFFFFFFFF"/>
</host-nfcf-service>
<!--HostNfcFService XML-->
apduservice.xml:
<!--HostApduService XML-->
<?xml version="1.0" encoding="utf-8"?>
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/servicedesc"
android:requireDeviceUnlock="false">
<aid-group android:description="@string/servicedesc"
android:category="other">
<aid-filter android:name="A0000002471001"/>
</aid-group>
</host-apdu-service>
<!--HostApduService XML-->
HostCardEmulatorService.java:
public class HostCardEmulatorService extends HostApduService {
private static HostCardEmulatorService.ScannedByRemoteListener listener;
@Override
public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
byte[] response = null;
if(listener != null)
{
response = listener.onScannedByRemote();
}
return response;
}
@Override
public void onDeactivated(int reason) {
}
public static void setOnScannedByRemoteListener(HostCardEmulatorService.ScannedByRemoteListener listener)
{
HostCardEmulatorService.listener = listener;
}
public interface ScannedByRemoteListener
{
public byte[] onScannedByRemote();
}
}
MyHostNfcFService.java:
public class MyHostNfcFService extends HostNfcFService {
private static ScannedByRemoteListener listener;
@Override
public byte[] processNfcFPacket(byte[] commandPacket, Bundle extras) {
byte[] response = null;
if(listener != null)
{
response = listener.onScannedByRemote();
}
return response;
}
@Override
public void onDeactivated(int reason) {
}
public static void setOnScannedByRemoteListener(ScannedByRemoteListener listener)
{
MyHostNfcFService.listener = listener;
}
public interface ScannedByRemoteListener
{
public byte[] onScannedByRemote();
}
}
我在清单文件中定义了两种方式,如下所示;
<manifest>
<uses-permission android:name="android.permission.NFC" />
<uses-feature
android:name="android.hardware.nfc"
android:required="true" />
...
<application>
...
<service
android:name=".HostCardEmulatorService"
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>
</application>
</manifest>
NfcFService 也一样。它们之间的唯一区别是“apdu”被重命名为“nfcf”。但即使两者都不起作用。我检查以下链接以了解一些东西。
Android Host Card Emulation with Arduino
NFC - Help to exchange data between RC522 & Android HCE
但我没有完全理解。所以,我只是做了我在那里看到的。当我尝试用阅读器扫描手机时,我认为其中一项服务会运行它的“processCommand”方法。但是什么也没发生。
有人知道怎么做吗? XML文件中的名称有什么特殊含义吗?因为我看到某处有 3 个名称不同的“辅助过滤器”。我错过了什么?
注意 1:我使用 Arduino Pro Mini 和 MFRC522 RFID 阅读器进行测试。我尝试扫描通过 MFRC522 从我的应用程序创建的 NFC ID。我必须使用另一个模块来解决这个问题吗?
注意 2:我在服务类中使用侦听器从活动中获取 NFC ID。
【问题讨论】: