Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android NFC标签密码保护与ST25安卓SDK_Android_Nfc_Password Protection_St25 - Fatal编程技术网

Android NFC标签密码保护与ST25安卓SDK

Android NFC标签密码保护与ST25安卓SDK,android,nfc,password-protection,st25,Android,Nfc,Password Protection,St25,我正在使用ST25标签,更具体地说是type5标签ST25DV64K。android的ST25SDK中有一些有趣的示例和教程。我仍在努力使用文档末尾提供的关于密码保护数据的代码示例,这些代码包含以下几行: byte[] password; int passwordNumber = type5Tag.getPasswordNumber(area); tag.presentPassword(passwordNumber, password); NDEFMsg ndefMsg = myTag.read

我正在使用ST25标签,更具体地说是type5标签ST25DV64K。android的ST25SDK中有一些有趣的示例和教程。我仍在努力使用文档末尾提供的关于密码保护数据的代码示例,这些代码包含以下几行:

byte[] password;
int passwordNumber = type5Tag.getPasswordNumber(area);
tag.presentPassword(passwordNumber, password);
NDEFMsg ndefMsg = myTag.readNdefMessage(area);
第一个问题,当我实例化一个type5标记时,我没有看到
Type5Tag
class的那些方法:

import com.st.st25sdk.type5.*;
Type5Tag tag5;
tag5.??

那么,我们首先不清楚应该如何设置密码。我找不到任何为特定区域设置密码并将其删除的示例,我们可以使用的密码格式是什么?是否可以从android上实现这一点,或者我们必须使用ST25应用程序?欢迎举例!谢谢。

在ST25 SDK Zip文件中,您将找到一个使用ST25 SDK库的基本Android应用程序示例(位于\integration\Android\examples\ST25AndroidDemoApp中)

本例使用一个名为“TagDiscovery”的类,该类能够识别任何ST25标记并实例化正确的对象。在您的情况下,如果您只使用ST25DV64K标记,您可能需要做一些简单的事情

以下是我的建议: 在您的android活动中,我希望您在每次录制NFC标记时都会收到通知(在“ST25AndroidDemoApp”示例中,查看onResume()函数中的enableForegroundDispatch()。 为了确定意图是否与“NFC意图”对应,我们检查意图的行为是否为发现的行动、发现的行动、发现的技术行动或发现的行动标签

在这种情况下,我们知道这是NFC的意图。然后我们可以调用它来获取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[];      // TODO: Fill the password
int passwordNumber = myST25DVTag.getPasswordNumber(area);
myST25DVTag.presentPassword(passwordNumber, password);
NDEFMsg ndefMsg = myST25DVTag.readNdefMessage(area);
在此之前,您需要检查与此区域关联的密码。该标签有3个密码,可以自由分配给任何区域。默认情况下没有设置密码,因此您应该设置一个。下面是一个示例,其中我对区域1使用密码2:

int AREA1 = 1;
int passwordChosen = 2;
myST25DVTag.setPasswordNumber(AREA1, passwordChosen);
                           
我建议您从Google Play安装“ST25 NFC Tap”Android应用程序: 如果您点击ST25DV并进入“区域安全状态”菜单,您将能够看到:区域数量、哪些区域受读写密码保护、使用了哪些密码……等等

如果您感兴趣,可在以下位置获取此应用程序的源代码:

如果有什么不清楚,请告诉我


免责声明:我是ST25 SDK开发团队的一员。

我不建议使用
enableForegroundDispatch()
设置密码或读/写设置了密码的标记,除非您需要支持API低于API 19,如
enableForegroundDispatch()
在实际用户使用时会产生大量错误。最好使用
enableReaderMode()。例如:打开URL、进行蓝牙配对、发送SMS…等等。enableForegroundDispatch()允许您的活动接管本机处理。换句话说,它意味着:“将NFC意图赋予当前活动,而不是执行本机处理”。仅当活动位于前台时才执行此操作(这就是为什么在onPause()中调用disableForegroundDispatch()非常重要)。它授权应用程序决定NFC意图应该做什么。您在enableForegroundDispatch()中遇到了什么样的错误?
enableForegroundDispatch()
如果您正在执行未缓存的
ndef
读取操作,则会生成大量的
TagLostException
IOException
。系统NFC服务/应用程序读取卡并发出通知声音,将任何数据打包成
意图
,然后必须
暂停
恢复
应用程序才能交付
意图
,然后,您必须在应用程序中处理
意图
,当您完成此操作时,用户已将卡移出RF字段,因为他们将通知声音视为成功。如果您必须自己读或写,则卡不在范围内。如果您所做的不是缓存的
ndef
读取,那么使用
enableReaderMode()
而不是
enableForegroundDispatch()
的另一个原因是大多数其他
标记
操作状态“这是一个I/O操作,将一直阻止,直到完成。不能从主应用程序线程调用它“,
onNewIntent
在主应用程序线程中运行,因此您应该创建自己的线程来处理NFC意图(大多数人不这样做)然而,
enableReaderMode
在新线程中自动运行
onTagDiscovered
。我们没有遇到您提到的问题。我们的应用程序接收NFC意图,然后通过收发器()完成所有NFC处理没错,它们不应该在UI线程中完成,所以我们使用的是异步任务。