在ST25 SDK Zip文件中,您将找到一个基本的Android应用程序示例,其中使用了ST25 SDK库(它在\integration\android\examples\ST25AndroidDemoApp中)。
例如使用了一个名为“TagDiscovery”的类,它能够识别任何ST25标签并实例化正确的对象。在您的情况下,如果您只使用ST25DV64K标签,则可能要做一些简单的事情。
我建议您:
在android活动中,我希望您已经订阅了每次点击NFC标签时都会收到通知(在“ST25AndroidDemoApp”示例中,在onResume()函数中查看enableForegroundDispatch())。
要确定Intent是否对应于“NFC Intent”,我们检查Intent的Action是否是ACTION_NDEF_DISCOVERED、ACTION_TECH_DISCOVERED或ACTION_TAG_DISCOVERED。
当这种情况发生时,我们知道它是一个NFC Intent。然后我们可以调用此方法来获取androidTag实例:
Tag androidTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
此对象表示Android中当前的NFC标签。
现在我们将实例化一个ST25DVTag对象。
import com.st.st25sdk.type5.st25dv.ST25DVTag;
…
AndroidReaderInterface readerInterface = AndroidReaderInterface.newInstance(androidTag);
byte[] uid = androidTag.getId();
uid = Helper.reverseByteArray(uid);
ST25DVTag myST25DVTag = new ST25DVTag(readerInterface, uid);
现在您拥有一个名为myST25DVTag的对象,可用于与标签通信!
例如,如果要使用密码:
byte[] password = new byte[];
int passwordNumber = myST25DVTag.getPasswordNumber(area);
myST25DVTag.presentPassword(passwordNumber, password);
NDEFMsg ndefMsg = myST25DVTag.readNdefMessage(area);
在执行此操作之前,您需要检查哪个密码与这个区域相关联。该标签有3个密码,可以自由地分配到任何区域。默认情况下,没有设置密码,因此您应该设置一个密码。以下是一个示例,在其中我使用密码2来保护Area1:
int AREA1 = 1;
int passwordChosen = 2;
myST25DVTag.setPasswordNumber(AREA1, passwordChosen);
我建议您从Google Play安装“ST25 NFC Tap” Android应用程序:
https://play.google.com/store/apps/details?id=com.st.st25nfc&hl=fr&gl=US
如果您敲击ST25DV并进入“区域安全状态”菜单,您将能够看到:区域数量,哪些区域受读写密码保护,使用哪个密码等等。
如果您有兴趣,该应用程序的源代码在此处可用:
https://www.st.com/en/embedded-software/stsw-st25001.html
如果有不清楚的地方,请告诉我。
免责声明:我是ST25 SDK开发团队之一。
enableForegroundDispatch()
,除非您需要支持低于API 19的API,因为当实际用户使用enableForegroundDispatch()
时会生成大量错误。相比之下,最好使用enableReaderMode()
,因为您可以在实际完成与标签交互时正确提示用户发出声音。 - AndrewenableForegroundDispatch()
如果你正在进行任何未缓存的ndef读取操作,会产生大量的TagLostException
或IOException
。系统NFC服务/应用程序读取卡片并发出通知声音,将任何数据打包到一个Intent
中,然后必须暂停和恢复您的应用程序以传递Intent
,然后您必须在应用程序中处理Intent
,而当您完成此操作时,用户已经将卡片移出了RF场,因为他们将通知声音视为成功。如果您必须自己进行读写,则卡片不在范围内。 - AndrewenableReaderMode()
而不是enableForegroundDispatch()
的另一个原因是,如果您要执行除缓存的ndef
读取之外的任何操作,大多数其他Tag
操作都会声明“这是一个I/O操作,并且将阻塞直到完成。它不能从主应用程序线程调用”,onNewIntent
在主应用程序线程中运行,因此您应该创建自己的线程来处理NFC Intent(大多数人不这样做),而enableReaderMode
会自动在新线程中运行onTagDiscovered
。 - Andrew