cms
当前位置:首页->常见问题
教你使用android nfc api写NFC tag信息
  • 作者:本站
  • 日期:2016-02-18
  • 出处:totcms
  • 点击:905


本文描述如何在android中使用nfc技术向设备写smart tags。当前android智能机不仅能读取NFC tags数据如URL,电话号码等,而且也能使用Android NFC Api写入NFC tags。本文中,我们将探索如何使用Android Api去写NFC smart tags(智能标签).


何为NFC技术?

在深入研究如何在android中使用NFC前有必要了解下什么是NFC技术。

Near Field Technology(NFC)是一种建立在两个兼容设备上短距离通信技术。NFC需要其中一个设备做为信息传送方,另一个做为接收方。NFC支持两种模式将设备组合起来: 

  • 被动模式
  • 主动模式

主NFC设备可以发送和接收并能和被动设备交换数据。被动设备可以无需电源把发送数据到其它可用的NFC设备上。一个典型的被动设备案例:NFC tag 可以作为广告系统使用。

NFC技术目前在新的android智能手机上已经支持,并且NFC 标签 被用作激活广告,智能支付等。更重要的是更应该知道如何在android中写入NFC 标签 。

开始学习使用NFC

首先开启NFC的android app要做的就是验证NFC是存在及是否激活:

1 @Override
2 protected void onCreate(Bundle savedInstanceState) {
3    ...
4    nfcMger = new NFCManager(this);
5    ..
6 }


这里nfcManager是处理NFC细节的类,它其实是使用的NfcAdapter处理验证::

01 public class NFCManager {
02  
03     private Activity activity;
04     private NfcAdapter nfcAdpt;
05  
06     public NFCManager(Activity activity) {
07         this.activity = activity;
08     }
09  
10     public void verifyNFC() throws NFCNotSupported, NFCNotEnabled {
11  
12         nfcAdpt = NfcAdapter.getDefaultAdapter(activity);
13  
14         if (nfcAdpt == null)
15             throw new NFCNotSupported();
16  
17         if (!nfcAdpt.isEnabled())
18             throw new NFCNotEnabled();
19  
20     }
21 }

再复习一下(如果你还没有读过getting started with NFC tutorial):当android 设备来到NFC tag附近里,有必要登记一个android app接收通知。要启动这个通知,我们需要使用NFC foreground dispatch:

01 @Override
02 protected void onResume() {
03   super.onResume();
04   try {
05     nfcMger.verifyNFC();
06     Intent nfcIntent = new Intent(this, getClass());
07     nfcIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
08     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, nfcIntent, 0);
09     IntentFilter[] intentFiltersArray = new IntentFilter[] {};
10     String[][] techList = new String[][] {
11                 { android.nfc.tech.Ndef.class.getName() }, 
12                 { android.nfc.tech.NdefFormatable.class.getName() }
13              };
14      NfcAdapter nfcAdpt = NfcAdapter.getDefaultAdapter(this);
15             nfcAdpt.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techList);
16      }
17      catch(NFCManager.NFCNotSupported nfcnsup) {
18         Snackbar.make(v, "NFC not supported", Snackbar.LENGTH_LONG).show();
19      }
20      catch(NFCManager.NFCNotEnabled nfcnEn) {
21         Snackbar.make(v, "NFC Not enabled", Snackbar.LENGTH_LONG).show();
22      }
23 }

如何在android中写入NFC 标签

在当android智能机接近NFC tag时android app可以随时准备处理NFC tag 。下一步就是写入数据到tag .
方法如下:

01 public void writeTag(Tag tag, NdefMessage message)  {
02   if (tag != null) {
03      try {
04         Ndef ndefTag = Ndef.get(tag);
05         if (ndefTag == null) {
06            // Let's try to format the Tag in NDEF
07            NdefFormatable nForm = NdefFormatable.get(tag);
08            if (nForm != null) {
09               nForm.connect();
10               nForm.format(message);
11               nForm.close();
12             }
13         }
14         else {
15            ndefTag.connect();
16            ndefTag.writeNdefMessage(message);
17            ndefTag.close();
18         }
19      }
20      catch(Exception e) {
21          e.printStackTrace();
22      }
23   }
24 }

这个方法接受我们将要写入的NFC tag的抽象描述,NdefMessage包含要写入的信息。第一步,NFCManager类尝试获取Ndef tag(第4行)。如果tag为null,那app尝试"format"这个tag并写入信息。如果这个tag已经format过了,Android app尝试连接tag的抽象描述并写入NdefMessageformat.

在android app中写Url数据到NFC Tag

现在已经知道如何向NFC Tag中写数据了,是时候开始尝试写一个简单的信息了。

第一个例子:写入URL信息

1 public NdefMessage createUriMessage(String content, String type) {
2      NdefRecord record = NdefRecord.createUri(type + content);
3      NdefMessage msg = new NdefMessage(new NdefRecord[]{record});
4      return msg;
5 }

这段代码比较简单,使用Android NFC Api提供的NdefRecord创建一个Uri 记录。我们已经知道,一个NdefMessage就是多条记录组成的数组,所以这里我们创建一个NFC Ndef Message持有一个记录:即Uri record(记录).这里的type变量值为http(代表是一个链接).

如果我们想写一段电话号码的NFC tag,当用户轻触相关的tag时触发电话呼叫,那就传递tel类型。

 

写文本数据到NFC

一个例子是写文本数据到NFC Tag:

01 public NdefMessage createTextMessage(String content) {
02   try {
03      // Get UTF-8 byte
04      byte[] lang = Locale.getDefault().getLanguage().getBytes("UTF-8");
05      byte[] text = content.getBytes("UTF-8"); // Content in UTF-8
06  
07      int langSize = lang.length;
08      int textLength = text.length;
09  
10      ByteArrayOutputStream payload = new ByteArrayOutputStream(1 + langSize + textLength);
11      payload.write((byte) (langSize & 0x1F));
12      payload.write(lang, 0, langSize);
13      payload.write(text, 0, textLength);
14      NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
15                              NdefRecord.RTD_TEXT, new byte[0],
16                              payload.toByteArray());
17      return new NdefMessage(new NdefRecord[]{record});
18   }
19   catch (Exception e) {
20      e.printStackTrace();
21   }
22   
23   return null;
24 }

Implementing the 实现NFC App的界面


一步就是实现UI,以令android app能处理不同的NFC 记录并且用户可以插入和写数据。app 使用spinner让用户选择不同的record记录类型。并编辑要写入的数据,点击按钮提交操作。当

用户点击按钮后,app开始等待NFC tag,当用户轻触到tag,app就开始写入数据。