这篇文章介绍了如何在Android中使用NFC编写智能标签 。 Android智能手机不仅能够
读取包含URL,电话号码等数据的NFC标签,但可以使用Android NFC Api编写NFC标签。 在本文中,我们将探讨如何使用Android Api编写NFC智能标记。
什么是NFC技术?
在深入探讨如何在Android中使用NFC的细节之前,先介绍一下什么是NFC技术是很有用的。
近场技术(NFC)是一种在支持此技术的两个兼容设备之间实现短距离通信的技术。 NFC要求一台设备充当发送器,另一台设备充当接收器。 支持NFC的设备可以分为两类:
- 活性
- 被动
有源NFC设备能够发送和接收数据,并且可以与无源设备交换数据。 无源设备可以在没有电源的情况下将数据发送到其他启用NFC的设备。 典型的无源设备是NFC标签,例如可以用作广告系统。
NFC技术可在最新的Android智能手机上使用,并且NFC标签用于主动广告,智能支付等。了解如何在Android中编写NFC标签非常重要。
开始使用NFC
启用NFC的Android应用程序应该做的第一件事是验证NFC是否存在以及是否处于活动状态:
@Override
protected void onCreate(Bundle savedInstanceState) {
...
nfcMger = new NFCManager(this);
..
}
哪里 nfcManager
是使用NfcAdapter处理NFC详细信息和实现的类:
public class NFCManager {
private Activity activity;
private NfcAdapter nfcAdpt;
public NFCManager(Activity activity) {
this.activity = activity;
}
public void verifyNFC() throws NFCNotSupported, NFCNotEnabled {
nfcAdpt = NfcAdapter.getDefaultAdapter(activity);
if (nfcAdpt == null)
throw new NFCNotSupported();
if (!nfcAdpt.isEnabled())
throw new NFCNotEnabled();
}
}
只是想回想一下,如果您还没有阅读NFC入门指南,则需要注册android应用,以便当Android设备靠近NFC标签时它会收到通知。 要启用此通知,我们必须使用
NFC前台调度
@Override
protected void onResume() {
super.onResume();
try {
nfcMger.verifyNFC();
Intent nfcIntent = new Intent(this, getClass());
nfcIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, nfcIntent, 0);
IntentFilter[] intentFiltersArray = new IntentFilter[] {};
String[][] techList = new String[][] {
{ android.nfc.tech.Ndef.class.getName() },
{ android.nfc.tech.NdefFormatable.class.getName() }
};
NfcAdapter nfcAdpt = NfcAdapter.getDefaultAdapter(this);
nfcAdpt.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techList);
}
catch(NFCManager.NFCNotSupported nfcnsup) {
Snackbar.make(v, "NFC not supported", Snackbar.LENGTH_LONG).show();
}
catch(NFCManager.NFCNotEnabled nfcnEn) {
Snackbar.make(v, "NFC Not enabled", Snackbar.LENGTH_LONG).show();
}
}
如何在Android中编写NFC标签
现在,Android应用程序已准备就绪,可以处理NFC标签,并且当Android智能手机靠近NFC标签时,会将事件通知给该应用程序。 下一步是将数据写入标签。 方法很简单:
public void writeTag(Tag tag, NdefMessage message) {
if (tag != null) {
try {
Ndef ndefTag = Ndef.get(tag);
if (ndefTag == null) {
// Let's try to format the Tag in NDEF
NdefFormatable nForm = NdefFormatable.get(tag);
if (nForm != null) {
nForm.connect();
nForm.format(message);
nForm.close();
}
}
else {
ndefTag.connect();
ndefTag.writeNdefMessage(message);
ndefTag.close();
}
}
catch(Exception e) {
e.printStackTrace();
}
}
}
此方法接受我们要编写的NFC标签和包含要编写的消息的NdefMessage的抽象表示。 第一步,NFCManager类尝试获取Ndef标签(第4行)。 如果标签为空,则应用程序尝试“格式化”标签并编写消息。 如果标签已经格式化,则Android应用会尝试连接到标签抽象表示并编写NdefMessage。
使用Android应用将URL写入NFC标签
现在知道如何将数据写入NFC标签,是时候开始编写一些简单的信息了。
作为第一个示例,Android NFC应用程序编写一个URL:
public NdefMessage createUriMessage(String content, String type) {
NdefRecord record = NdefRecord.createUri(type + content);
NdefMessage msg = new NdefMessage(new NdefRecord[]{record});
return msg;
}
该代码非常简单,使用Android NFC Api提供的NdefRecord ,Android应用程序会创建Uri记录。 众所周知, NdefMessage是一个记录数组,因此我们创建了一个NFC Ndef Message,它仅包含一个记录:Uri记录。 type
保留http值,因为它是一个链接。
包含电话号码的NFC标签,以便当用户用智能手机点击该标签时会触发电话呼叫,则必须以tel:类型传递。
将文本数据写入NFC标签
最后一个示例是在NFC标签中写入文本数据。 在这种情况下,遵循NFC规范,代码非常简单:
public NdefMessage createTextMessage(String content) {
try {
// Get UTF-8 byte
byte[] lang = Locale.getDefault().getLanguage().getBytes("UTF-8");
byte[] text = content.getBytes("UTF-8"); // Content in UTF-8
int langSize = lang.length;
int textLength = text.length;
ByteArrayOutputStream payload = new ByteArrayOutputStream(1 + langSize + textLength);
payload.write((byte) (langSize & 0x1F));
payload.write(lang, 0, langSize);
payload.write(text, 0, textLength);
NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
NdefRecord.RTD_TEXT, new byte[0],
payload.toByteArray());
return new NdefMessage(new NdefRecord[]{record});
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
为NFC应用实现Android UI
最后一步是实现UI,以便Android应用处理不同的NFC记录类型,并且用户可以插入要写入的数据。 该应用程序使用一个保存不同记录类型的微调器和一个保存要写入的数据的EditText,最后使用一个按钮(一个Floating Action Button)来开始操作。 用户单击按钮后,应用程序即开始等待NFC标签。 当用户点击标签时,应用程序将开始写入数据。
翻译自: https://www.javacodegeeks.com/2016/01/write-nfc-tag-android.html