我想将简单的文本数据写入我的恩智浦MiFARE DesFire EV1(NDEF Type 4标签)。但是,写入过程总是失败,并显示 IOExcetion
为了写作,我得到NFC标签,我使用函数写
:
private void write(String mimeType, String text, Tag tag) throws IOException, FormatException {
NdefRecord[] records = {createRecord(mimeType, text)};
NdefMessage message = new NdefMessage(records);
Ndef ndef = Ndef.get(tag);
ndef.connect();
ndef.writeNdefMessage(message);
ndef.close();
}
第三行(Ndef ndef=Ndef.get(标签)
)的结果如下:
TAG: Tech [android.nfc.tech.IsoDep, android.nfc.tech.NfcA, android.nfc.tech.Ndef]
由此我假设,标签的格式正确(作为NDEF)。现在,当调用<code>ndef时。connect()它只显示java.io。exception</code>,而没有关于错误的任何其他信息。被调用的代码的其他部分被附加。
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
String action = intent.getAction();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (tag != null) {
String serialId = Utility.bytesToHex(tag.getId());
Log.d("[WriteCard]", "Serial Number: " + serialId);
Toast.makeText(this, serialId, Toast.LENGTH_SHORT).show();
}
}
}
// When the write Button is clicked
public void onClick(View view) {
if (nfc_adapter == null) {
Toast.makeText(this, "No NFC", Toast.LENGTH_SHORT).show();
return;
}
int id = view.getId();
Intent intent = getIntent();
try {
write("type/1", spinner_location.toString(), tag);
}
catch(Exception e) {
Log.d("[WriteCard]", e.toString());
Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
}
}
恩智浦标签信息应用报告以下内容:
IC类型:MiFARE DESFire EV1
类型4标签
NFC数据集访问:读取
附加信息:使用Android应用程序(如NFC TagWriter by NXP或wakdev NFC Tools)的编写过程没有任何问题,因此我假设标签正常工作。
真正尝试在单击按钮时写入标记总是不可靠的,而且在现实生活中使用enableForeGroundDispatch
也是不可靠的。你提到的两个应用程序并没有按照你想要的方式来做。
文档中还提到了< code>connect和< code>writeNdefMessage
可能导致射频活动并可能阻塞。不得从主应用程序线程调用。
您从主(UI)线程调用这些。
你的按钮只需要设置“当标签进入范围时,立即写文本”的动作
例如,类似的东西
private String text;
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
String action = intent.getAction();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (tag != null) {
if(text.isEmpty()) {
// Nothing to write so read
String serialId = Utility.bytesToHex(tag.getId());
Log.d("[WriteCard]", "Serial Number: " + serialId);
Toast.makeText(this, serialId, Toast.LENGTH_SHORT).show();
} else {
// Have some text to write
try {
write("type/1", text, tag);
} catch(Exception e) {
Log.d("[WriteCard]", e.toString());
Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
}
// Reset the write trigger
text = "";
}
}
}
// When the write Button is clicked
public void onClick(View view) {
text = spinner_location.toString();
}
此外,在尝试写入之前,您确实需要检查您的标签是否是格式化的Ndef标签。
例如,类似的东西
private void write(String mimeType, String text, Tag tag) throws IOException, FormatException {
NdefRecord[] records = {createRecord(mimeType, text)};
NdefMessage message = new NdefMessage(records);
Ndef ndef = Ndef.get(tag);
if(ndef != null) {
// It's an already formatted Ndef Tag
ndef.connect();
ndef.writeNdefMessage(message);
ndef.close();
} else {
// Try and format at write
.... "get(tag)" for Ndef formattable type and check not null
}
}
最后一点是使用旧的enableFore领导调度
是不可靠的,所以使用更新更好的enableReaderModel
和onTagDis的
API代替。
这也解决了错误线程上的调用连接
等问题,因为 onTagDiscovery
会自动在它自己的线程中。
此外,当您禁用“平台”声音时,它还启用 ReaderMode
,它不会提示您用户在您有机会写入之前从范围中删除标签(您可以在成功写入后播放自己的声音)
有关enableReaderMode
的示例,请参见https://stackoverflow.com/a/64921434/2373819。
如何将NDEF消息写入NFC标记?我必须更改清单文件吗?到目前为止,我有生成NDEF消息的代码: 如何发现标签?有人能帮我吗?
我正在尝试创建一个 NFC 标签,该标签将触发两个单独的操作: 打开蓝牙连接 启动应用程序(或前往游戏商店) 我使用 nfc-eclipse-plugin 创建了一个包含两个合适记录的消息,但是,当写入标签时,它总是只触发第一个操作。两者都单独工作,但第二个总是被忽略。 我知道一个NFC标签上的2个NDEF消息/记录的答案-Android说你不能在一个标签上有两条独立的消息,只有一条消息中的多条记
类似的问题 - 如何在Android中读取检测到的NFC标签(NDEF内容)详细信息? 我希望我的android应用程序能够读取和解析检测到的NDEF消息。 我已经编辑了AndroidManifest.xml来检测nfc标签,并添加了意图过滤器,如下所示 我相信这很好,因为当我使用SDK附带的NFCDemo示例应用程序创建MockNDEF标签时,当我可以选择处理这些生成的标签的应用程序列表出现时,
问题内容: 我已经实现了通过低级通信方法与NTAG216进行交互的代码(紧随NTAG212 Mifare Ultralight withAuthentication和NTAG216的数据表之后)。 到目前为止,我取得了以下成就: 如果未设置密码或新标签/空白标签,请在NTAG216上设置密码写保护。 如果已设置密码,请使用PWD_AUTH并比较PACK进行身份验证。 读取数据。 写入/覆盖数据。
我已经实现了通过低级通信方法与NTAG216交互的代码(遵循NTAG212 Mifare Ultralight与身份验证和NTAG216的数据表)。 如果未设置或如果新/空白标签,请在NTAG216上设置密码写入保护。 如果已设置密码,请使用PWD_AUTH并比较PACK进行身份验证。 读取数据。 写入/覆盖数据。 检测我在其他应用程序中写入标签的NDEF消息。换句话说,我可以使用方法写入标签,也
我正在尝试使用ACR122U NFC阅读器在Windows窗体应用程序(用C#编写)中创建并写入NFC标记的NDEF消息。 我使用Andreas Jakl的NDEF库创建了NDEF消息的原始字节。这是C#代码: 我得到的输出是D1 01 04 54 02 65 6E 31(十六进制)。