官方API:
https://developer.android.google.cn/guide/topics/connectivity/nfc/nfc

基础概念,什么是nfc?

Near Field Communication (NFC)是一组短程无线技术,通常需要4cm或更少的距离来启动连接。NFC允许您在一个NFC标签和一个android设备之间,或在两个android设备之间共享少量有效数据。

主要模式

带有NFC的安卓设备同时支持三种主要操作模式:
1,读写模式,允许NFC设备读写无源NFC标签和贴纸。
2,P2P模式,允许NFC设备与其他NFC节点交换数据;此操作模式为Android Beam所采用。
3,卡仿真模式,允许NFC设备本身作为一个NFC卡。模拟的NFC卡可以由外部NFC阅读器(如NFC销售点终端)访问。

Android中使用NFC发送和接收NDEF标准的消息

在Android中执行的基本NFC任务。如何以NDEF消息的形式发送和接收NFC数据。
使用NDEF数据和Android有两个主要的用例:
1.从NFC标签读取NDEF数据
2.使用Android Beam™将NDEF消息从一个设备发送到另一个设备

从NFC标签读取NDEF数据由标签分发系统处理,该系统分析发现的NFC标签,对数据进行适当的分类,并启动对分类数据感兴趣的应用程序。希望处理被扫描的NFC标记的应用程序可以声明一个intent过滤器并请求处理数据。

标签调度系统
安卓设备通常在解锁时寻找NFC标签,除非在设备的设置菜单中禁用NFC。当android驱动的设备发现一个NFC标签时,期望的行为是让最合适的活动处理意图,而不询问用户使用什么应用程序。由于设备扫描NFC标签的范围非常小,因此让用户手动选择一个活动可能会迫使他们将设备从标签处移开,并断开连接。您应该开发活动来只处理活动关心的NFC标记,以防止活动选择器出现。

怎么做到的呢?

Android提供了一个特殊的标签分发系统,可以分析扫描的NFC标签,解析它们,并尝试定位对扫描数据感兴趣的应用程序。它是这样做的:
1.解析NFC标记并计算出用于标识标记中的数据有效负载的MIME类型或URI。
2.将MIME类型或URI和有效负载封装到intent中。前两个步骤将在如何将NFC标记映射到MIME类型和uri中进行描述。
3.基于意图启动一个活动。这在如何将NFC标记分配到应用程序中进行了描述。

如何将NFC标记映射到MIME类型和uri

在开始编写NFC应用程序之前,了解不同类型的NFC标记、标记分发系统如何解析NFC标记以及标记分发系统在检测到NDEF消息时所做的特殊工作非常重要。NFC标签有各种各样的技术,也可以用多种不同的方式写入数据。Android对NDEF标准的支持最多,NDEF标准是由NFC论坛定义的。
NDEF数据封装在一个消息(NdefMessage)中,该消息包含一个或多个记录(NdefRecord)。每个NDEF记录必须根据您想要创建的记录类型的规范定义好的格式。

如何将NFC标签分配给应用程序

当标签分发系统完成创建封装NFC标签及其标识信息的意图时,它将该意图发送到对该意图进行筛选的感兴趣的应用程序。如果有多个应用程序可以处理意图,则会显示活动选择器,以便用户可以选择活动。标签调度系统定义了三个意图,按照从高到低的优先级排列:
1,ACTION_NDEF_DISCOVERED:此意图用于在扫描包含NDEF有效负载的标记并具有可识别的类型时启动活动。这是最高优先级的意图,标记调度系统尽可能在任何其他意图之前尝试启动具有此意图的活动。,2,ACTION_TECH_DISCOVERED:如果没有活动注册来处理ACTION_NDEF_DISCOVERED意图,标记调度系统将尝试使用此意图启动应用程序。如果被扫描的标记包含不能映射到MIME类型或URI的NDEF数据,或者标记不包含NDEF数据,但属于已知的标记技术,则此意图也将直接启动(无需首先启动ACTION_NDEF_DISCOVERED)。
3,ACTION_TAG_DISCOVERED:如果没有活动处理ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED意图,则启动此意图。

标签调度系统的基本工作方式如下:

1.尝试在解析NFC标记(ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED)时使用标记调度系统创建的意图启动活动。
2.如果没有针对该意图的活动过滤,则尝试以下一个最低优先级的意图(ACTION_TECH_DISCOVERED或ACTION_TAG_DISCOVERED)启动活动,直到应用程序对该意图进行过滤,或者直到标记调度系统尝试所有可能的意图。
3.如果没有应用程序对任何意图进行过滤,则什么也不做。