APP下载

基于Android的NFC编程技术研究及应用

2019-01-06陈三清

无线互联科技 2019年21期

陈三清

摘   要:近年来,NFC技术在移动设备、消费类电子产品等近距非接触式的众多领域得到了广泛应用,其基本原理本质上是RFID技术。Android是现在使用最为广泛的移动智能设备,Android平台上有支持NFC应用开发的类和方法。在Android平台的NFC应用开发中,文章主要阐述了AndroidManifest文件中NFC应用开发设定、NFC标签的过滤、NFC数据的关键读取和写入操作。

关键词:近距离无线通信;Tag标签;Android;近距离无线通信编程

近年来,随着通信技术的发展和智能设备的普及,近距离无线通信(Near Field Communication,NFC)技術在门禁管理、信用卡、物流管理、非接触式移动支付、登机验证、智慧海报及广告、设备间数据传输等众多方面得到了广泛应用。与射频识别(Radio Frequency IDentification,RFID)类似,NFC信息是通过频谱中无线频率部分的电磁感应耦合方式进行传输,但传输范围要比RFID小,不超过1 m,实际应用通常在10 cm之内,不需要电源,相比蓝牙来说,具有成本低、耗电量低、较高保密性和安全性的特点,是在近距离通信领域和场合下对蓝牙技术的一种有益补充。

1    NFC通信简介

RFID是NFC无线通信的核心技术,通过无线电信号识别特定目标并读写相关数据,而无须系统与特定目标之间建立机械地或者光学接触[1]。从概念上讲,RFID类似于条码扫描,条码技术是将已编码的条形码附着于目标物,并使用专用的扫描器读写器,利用光信号将信息由条形磁传送到扫描读写器[2]。RFID使用专门的RFID读写器及专门的可附着于目标物的RFID标签,利用频率信号将信息由RFID标签传送至RFID读写器。其基本工作原理是[3]:当标签进入磁场后,接收解读器发出的射频信号,凭借感应电流所获得的能量发送存储在芯片中的产品信息,即无源标签或被动标签,Passive Tag,或者由标签主动发送某一频率的信号,即有源标签或主动标签,Active Tag,解读器读取信息并解码后,送至中央信息系统进行有关数据处理。

2    Android系统中对NFC的支持

一般来说,具有NFC功能的手机,其NFC芯片是作为RFID模块的一部分的装在手机上的,如果没有NFC硬件模块,手机也不能支持基于NFC的应用,至少Android 2.3版本以上才支持NFC开发。基于Android平台的NFC应用开发,主要使用android.nfc包中的类及方法,包括以下几个:

(1)NfcManager类和NfcAdapter类。NfcManager类是一个NFC Adapter的管理器类,通过该类的getDefaultAadpter(context)方法来获取系统支持的NFC Adapter,也可使用NfcAdapter类的静态方法getDefaultAadpter()来获取,有了NFC Adapter后就可以进行NFC相关后续操作,比如定义一个Intent来将系统检测到的Tags消息发送到事先定义好的Activity,并执行标签的读写操作。

(2)NdefMessage和NdefRecord类。NFC数据交换格式(NFC Data Exchange Format,NDEF)是NFC论坛定义的数据格式,用来将有效数据存储到NFC Tags中,如文本、URL和其他MIME类型。一个NdefMessage就是一个集合,可以包含0个或多个NdefRecord,每一个NdefRecord有一个类型。在NdefMessage中第一个NdefRecord,主要是用来发送Tag到一个Android设备上的Activity,通过NdefMessage的方法getRecords可以查询到NdefMessage的所有NdefRecord。

3    Android平台下的NFC编程应用

通常运行NFC APP,在Android设备靠近或检测到NFC Tag时,会自动运行一个Activity或对应的程序处理这个Tag并显示处理结果,能够简化用户操作的过程,这是编写NFC APP期望的结果。由于NFC通信通常在近距离才有效,如果操作过多就会有可能造成通信断开。因而在设计APP时,要避免用户做过多选择或操作,要让程序自动选择匹配合适、快捷的方式,在编程实现时,需精确设计程序的启动条件和匹配参数。

3.1  AndroidManifest文件关键设置

不管以何种方式启动Activity,Android NFC标签调度系统(Tag Dispatch System,TDS)都会根据NFC Tag进行相关后续的动作,在Android NFC APP编程实现时,做好以下准备。

首先,在AndroidManifest中添加NFC使用权限“android.permission.NFC”及设置SDK的级别限制,如若有必要,添加声明Android NFC的限制权限。

其次,在Activity对应的Intent过滤器中实现NFC标签过滤。在AndroidManifest文件中设置NFC标签过滤,就是要匹配启动Activity的Intent中所包含的动作类型,有3种类型标签:

(1)Android.nfc.action.NDEF_DISCOVERED标签,对应Intent意图中的动作NfcAdapter.ACTION_NDEF_DISCOVERED,含义是当一个标签包含标准的NDEF数据并被正确识别时,被用来启动设定当前标签的Activity,且优先于其他Activity启动。如果在匹配Activity的同时过滤数据,需添加MIME或data过滤。

(2)Android.nfc.action.TECH_DISCOVERED标签,对应Intent意图中的动作NfcAdapter.ACTION_TECH_DISCOVERED,如无Activity注册处理ACTION_NDEF_DISCOVERED意图,标签调度系统就会尝试启动该标签对应的Activity或应用。在设定此标签时,需指明Activity支持的技术列表,用于对比是否为应用支持的技术,通常用一个XML资源文件进行说明。同时在AndroidManifest文件中,在下使用元素声明刚创建的资源文件。每一个技术列表是独立的,也可以指定多个列表集合,使用getTechList()方法获取标签的技术后,与任意一个列表匹配都算匹配,还可以定义“与”和“和”的逻辑。

(3)Android.nfc.action.TAG_DISCOVERED标签,对应Intent意图中的动作NfcAdapter.ACTION_TAG_DISCOVERED,在前两种情况都不匹配的情况下使用。

3.2  关键代码实现

3.2.1  读取数据操作

首先,要获取NFC设备适配器,只需一条语句:NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this)。

通过判断nfcAdapter是否为NULL来判断设备是否支持NFC功能。如果手机不支持NFC,则提示后直接退出,如果没有开启则提示开启NFC功能,这是要进行NFC通信的第一步。

完成第一步判断后,为扫描NFC设备获取Tag数据,通常要用一个PendingIntent对象来封装NFC标签的详细信息。

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

要做一个IntentFilter,过滤想要的action,如果android设备支持MIFARE,则要提供对MIFARE Classic目标的属性和I/O操作允许扫描的标签类型。

以上动作在Activity的onCreate()方法中完成,設置NFC开始扫描的时间,可以在Activity的onResume()方法中调用以下方法:

void android.nfc.NfcAdapter.enableForegroundDispatch(Activity activity, PendingIntent intent, IntentFilter[] filters, String[][] techLists)

封装好相关的参数,就可以实现前台推送Intent发起NFC扫描动作,此intent还可以用于接收信息。要想解析扫描到的NFC标签的数据,就需重载onNewIntent(Intent intent)方法,在此方法中对intent包含的信息进行处理,示例如下:

@Override

protected void onNewIntent(Intent intent) {

super.onNewIntent(intent);

if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) {

String result = processIntent(intent);//调用处理方法

resultText.setText(result);//将处理结果显示在文本控件上

}

}

这种方法对在包中将启动模式设置为“singleTop”的Activity,或是在调用startactivity时使用了Intent.FLAG_ACTIVITY_SINGLE_TOP标志的Activity会重新启动,而不是新创一个Activity实例。

对扫描到的NFC标签数据的处理方法processIntent(Intent intent)是一个自定义方法,主要是对Intent包含数据进行处理,典型处理方式如下:

private String processIntent(Intent intent) {

Parcelable[] rmsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

NdefMessage msg = (NdefMessage) rmsgs[0];

NdefRecord[] records = msg.getRecords();//获取NDEF中record数组

String resultStr = new String(records[0].getPayload());//返回可变长度的有效负载

return resultStr;

}

此外,还可用setNdefPushMessageCallback()方法实现信息接收。

3.2.2  写入数据操作

要在一个Activity中实现向NFC对象写入数据,其部分步骤是与读出数据类似的。先声明定义PendingIntent对象、IntentFilter对象、技术列表对象等参数,使其与读数据的操作一致,再在onResume()中使用enableForegroundDispatch()进行分发Tag Intent。不同的是,需在onNewIntent()方法中将普通信息封装为NdefMessage信息进行写入,以下是封装方法部分示例代码:

// 根據文本生成一个NdefRecord,然后再封装为一个NdefMessage

private NdefMessage getNoteAsNdef() {

byte[] textBytes = text.getBytes();

NdefRecord textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,

“image/jpeg”.getBytes(), new byte[] {}, textBytes);

return new NdefMessage(new NdefRecord[] { textRecord });

}

除此方法外,还可在实现CreateNdefMessageCallback回调时重载createNdefMessage()方法,实现对普通信息的NdefMessage格式的封装。不管是哪种方法,最核心的是要生成NdefMessage消息,然后调用enableForegroundDispatch()将信息写入NFC Tag中。

4    结语

NFC通信是Android手机一种重要的无线通信技术,在生活中有着非常突出的应用,使用快捷、简单,工作原理并不复杂,但其在Android平台的编程应用对很多Android开发者来说并不是一件简单的事情。本文特就NFC编程技术实现进行了深入分析、研究,着重论述了关键参数的设置和关键方法的使用,为顺利开发出更多NFC APP做技术准备。

[参考文献]

[1]马跃坤.用于动态车辆识别的高速远距离RFID读写设备研究与实现[D].杭州:浙江工业大学,2010.

[2]叶淑凤.试论RFID在图书馆应用的可行性[J].科技情报开发与经济,2005(4):18-19.

[3]王子陆.基于物联网SoC的AGC研究与设计[D].北京:北京交通大学,2012.

Research and application of NFC programming technology based on Android

Chen Sanqing

(School of Mathematics and Computer, Panzhihua University, Panzhihua 617000, China)

Abstract:In recent years, NFC has been widely used in many fields such as mobile devices, consumer electronics products, etc. Its basic principle is essentially RFID technology, while Android is the most widely used mobile smart device, on Android platform. Classes and methods supporting NFC application development; In the development of NFC application under Android platform, this paper mainly describes the development settings of NFC application in Android Manifest file, the filtering of NFC tags, the key reading and writing operations of NFC data.

Key words:near field communication; Tag tag; Android; near field communication programming