本节书摘来自异步社区《android nfc开发实战详解》一书中的第6章,第6.1节关于nfc p2p模式,作者 赵波,更多章节内容可以访问云栖社区“异步社区”公众号查看
6.1 关于nfc p2p模式
android nfc开发实战详解
p2p模式是nfc 3种模式之一(其他两种为读写模式、卡模拟模式),主要完成在两个nfc设备之间数据的传递,传输的一方同时也可以是接收对方的数据。p2p模式在android2.3.3+(api 10)中开始加入,其采用的是foreground ndef push的方法,在android4.0 +(api 14)后又重新提供了一套新的api函数(又称为beam)。对于上述两种方式,在本章中为大家进行详细介绍。
注意,android nfc p2p功能是在api 10以后版本中才加入的,这与android nfc读写模式开发稍有不同(其在api 9中开始加入)。因此,在android api 9中,可以进行nfc读写tag的应用开发,但p2p功能的开发必须在api 10以上版本才支持,这点在开发中需要注意。另外,如上所述,在api 10以上系统版本开发p2p功能时,android系统提供了两套api方法。在api 10+中提供的是foreground ndef push的api方法—enableforegroundndefpush(),在api 14+提供的是setndefpushmessagecallback()方法和setndefpushmessage()方法,这点在开发中也需要注意。
6.1.1 beam使用的条件
nfc p2p模式是指两个nfc设备在靠近彼此时完成数据的交换。在android api 14+后,将两个android设备之间通过p2p传输数据称为beam,在两个设备之间要完成beam功能,必须具备以下几个条件:
(1)必须打开手机的android beam功能,具体在android的设置中,如图6-1所示;
(2)要实现beam ndef消息的应用程序(发送端)必须在前台,不能是后台服务,不能处在锁屏状态;
(3)要接收beam消息的手机(接收端),其屏幕不能处在锁屏状态;
(4)要在android手机设备中完成beam功能,其手机系统版本必须是api 14+(api 10+也可以实现p2p功能,但一般习惯在api 14+后新提供的api实现的p2p功能称为beam功能);
(5)两个手机在进行彼此靠近实现beam功能时,会弹出图6-2所示的画面,显示“touch to beam(触摸发射)”,此时,用户应该触碰需要beam ndef消息的设备,即发射设备(另一设备即为接收beam消息)。注意,该过程仅在api 14+以上系统才具备。

6.1.2 beam enable的判断
在第4章中,本书介绍了android app开发中如何判断系统上是否支持nfc功能以及nfc功能是否开启。这里需要特别注意,系统在支持nfc功能及nfc功能开启的情况下并不能说明系统beam功能也是ok的,在api 14+后android系统中加入了isndefpushenabled( )方法,大家可以通过该函数判别beam功能是否enable,具体代码如下:
第9行通过nfcadapter.getdefaultadapter(this)获取nfc适配器,通过其判断当前设备是否支持nfc功能。
第18行通过mnfcadapter.isenabled()来判断当前设备nfc功能是否开启。
第27行通过mnfcadapter.isndefpushenabled()来判断当前设备beam功能是否可用。
注意,在上述提到过,通过isndefpushenabled函数判断beam功能是否enable。当返回为ture时,nfc和beam功能都是enable的;当返回为false时,此时beam功能是disable的,但只要nfc功能是enable的,android设备仍能接收beam消息只是不能beam ndef消息。
更进一步地说,在两个android nfc设备靠近时,如果发送设备上(bnm)当前打开的应用程序并没有实现android beam功能,系统也会自动发送一条默认的ndef消息给接收端(rbm)。该ndef消息为发送端当前应用程序的uri,接收端接收到这条uri时,若系统版本是api 10~api 13,则系统会提示用户该应用程序未打开;若系统版本是api 14+时,此时系统会自动跳转到google paly中该app的下载链接页供用户下载。有了这个功能,用户之间可以很轻易的实现app的分享。假设手机中有一个非常好玩的游戏app,若要将此app分享给好友,只要打开该游戏然后触碰一下好友的手机,该手机马上会打开对应的app(当该app已经安装的情形下)或者跳转到google play中该app的下载链接页,很方便的实现分享。
另还有一点需要注意,如果在前台的activity中启用了android beam,那么标准的intent调度系统就会被禁用。但是,如果该activity还启用了前台调度,那么在前台调度系统中,它依然能够扫描到跟intent过滤器匹配的nfc标签。