使用android nfc api写NFC tag信息
2016-02-23 17:13
435 查看
当前android智能机不仅能读取NFC tags数据如URL,电话号码等,而且也能使用Android NFC Api写入NFC tags。本文我们将探索如何使用Android Api去写NFC smart tags(智能标签).
在深入研究如何在android中使用NFC前有必要了解下什么是NFC技术。
Near Field Technology(NFC)是一种建立在两个兼容设备上短距离通信技术。NFC需要其中一个设备做为信息传送方,另一个做为接收方。NFC支持两种模式将设备组合起来:
被动模式
主动模式
主NFC设备可以发送和接收并能和被动设备交换数据。被动设备可以无需电源把发送数据到其它可用的NFC设备上。一个典型的被动设备案例:NFC tag 可以作为广告系统使用。
NFC技术目前在最新的android智能手机上已经支持,并且NFC 标签 被用作激活广告,智能支付等。更重要的是更应该知道如何在android中写入NFC 标签 。
首先开启NFC的android app要做的就是验证NFC是存在及是否激活:
这里nfcManager是处理NFC细节的类,它其实是使用的NfcAdapter处理验证::
当android 设备来到NFC tag附近,登记一个android app接收通知。要启动这个通知,我们需要使用NFC foreground dispatch:
在当android智能机接近NFC tag时android app可以随时准备处理NFC tag 。下一步就是写入数据到tag .
方法如下:
这个方法接受我们将要写入的NFC tag的抽象描述,NdefMessage包含要写入的信息。第一步,NFCManager类尝试获取Ndef tag(第4行)。如果tag为null,那app尝试"format"这个tag并写入信息。如果这个tag已经format过了,Android app尝试连接tag的抽象描述并写入NdefMessageformat.
现在已经知道如何向NFC Tag中写数据了,是时候开始尝试写一个简单的信息了。
第一个例子:写入URL信息
这段代码比较简单,使用Android NFC Api提供的NdefRecord创建一个Uri 记录。我们已经知道,一个NdefMessage就是多条记录组成的数组,所以这里我们创建一个NFC Ndef Message持有一个记录:即Uri record(记录).这里的type变量值为http(代表是一个链接).
如果我们想写一段电话号码的NFC tag,当用户轻触相关的tag时触发电话呼叫,那就传递tel类型。
最后一个例子是写文本数据到NFC Tag:
最后一步就是实现UI,以令android app能处理不同的NFC 记录并且用户可以插入和写数据。app 使用spinner让用户选择不同的record记录类型。并编辑要写入的数据,最后点击按钮提交操作。当用户点击按钮后,app开始等待NFC tag,当用户轻触到tag,app就开始写入数据。
何为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 | } |
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 | } |
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 | } |
在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 | } |
如果我们想写一段电话号码的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就开始写入数据。
相关文章推荐
- Android 单字阅读
- Android APK反编译就这么简单 详解(附图)
- Android Fragment 真正的完全解析(上)——张鸿洋老师
- Android dex分包方案 (多dex)
- Android之利用Viewpager实现图片的轮播效果
- 深入理解Android 读感(一)
- ANDROID_MARS学习笔记_S02重置版_001_Hander\Looper\Message\Thread\ThreadLocal
- android 开机自动启动
- Android中aidl的解析和使用
- android开发中如何结束所有的activity
- android LruCache内存缓存源码解析
- Android开发之TabHost篇01
- 在Android app中实现九(n)宫格图片连续滑动效果
- Android Activity类详解(一)
- Android中Preference的使用以及监听事件分析 .
- 强烈推荐转载-Android 性能测试
- 【转】Android日常开发60条经验
- Android C++向java传递不定长且不同类型的参数
- android 轻松搞定标题随scrollview滑动变色
- Android笔记:导航栏和状态栏的透明度设置