Android NFC开发详细总结

Near Field Communication (NFC) 为一短距离无线通信技术,通常有效通讯距离为4厘米以内。NFC工作频率为13.65 兆赫兹,通信速率为106 kbit/秒到 848kbit/秒。NFC手机相比普通手机来说,

短范围无线技术。

1.NFC基础

NDEF消息格式来发送和接收NFC数据,

从NFC标签中读取NDEF数据是用标签调度系统来处理的,它会分析被发现的NFC标签,对数据进行适当的分类,并启动对该类数据感兴趣的应用程序。想要处理被扫描到NFC标签的应用程序会声明一个Intent过滤器,并请求处理数据。

Android Beam™ 功能允许设备把一个NDEF消息推送到物理/硬件上相互监听的另一个设备上。这种交互提供了比其他无线技术(如蓝牙)更容易的发送数据的方法。因为NFC不需要手动的设备发现或配对要求,两个设备在接近到一定范围时会自动的连接。Android Beam通过一组NFC API来使用,以便应用程序能够在设备之间来传输信息。例如,通信录浏览器以及YouTube等应用程序都使用Android Beam来跟其他设备共享通信录、网页和视频。

1.1 NFC标签调度系统 (The Tag Dispatch System)

通常是在设备的设置菜单中NFC被禁用,否则Android设备会在非锁屏的状态下搜索NFC。当Android设备发现NFC标签时,期望的行为是用最合适的Activity来处理该Intent,而不是询问用户使用什么应用程序。因为设备只能在很短的范围内扫描到NFC标签,强制的让用户手动的选择一个Activity,会导致设备离开NFC标签,从而中断该连接。你应该开发你自己的Activity来处理你所关心的NFC标签,从而阻止 选择器的操作。

为了帮助你达到这个目标,Android提供了特殊的标签调度系统,来分析扫描到的NFC标签,通过解析数据,在被扫描到的数据中尝试找到感兴趣的应用程序,具体做法如下:

1.解析NFC标签并搞清楚标签中标识数据负载的MIME类型或URI;

2.把MIME类型或URI以及数据负载封装到一个Intent中。

3.基于Intent来启动Activity。

1.1.1 怎样把NFC标签映射到MIME类型和URI

开始编写NFC应用程序之前,重要的是要理解不同类型的NFC标签、标签调度系统是如何解析NFC标签的、以及在检测到NDEF消息时,标签调度系统所做的特定的工作等。

NDEF数据格式:

NFC Data Exchange Format : NFC数据交换格式,NFC组织约定的NFC tag中的数据格式。

NDEF是轻量级的紧凑的二进制格式,可带有URL、vCard和NFC定义的各种数据类型。

NDEF的由各种数据记录组成,而各个记录由报头(Header)和有效载荷(Payload)组成,其中NDEF记录的数据类型和大小由记录载荷的报头注明,这里的报头包含3部分,分别为Length、Type和Identifier.。

NDEF数据被封装在一个消息(NdefMessage)中,该消息中包含了一条或多条记录(NdefRecord)。每个NDEF记录必须具有良好的你想要创建的记录类型的规范的格式。Android也支持其他的不包含NDEF数据类型的标签,你能够使用android.nfc.tech包中的类来工作。要使用其他类型标签来工作,涉及到编写自己的跟该标签通信的协议栈,因此我们建议你尽可能的使用NDEF,以便减少开发难度,并且最大化的支持Android设备。

注意:要下载完整的NDEF规范,请去“NFC论坛规范下载”网址来下载。

接下来要详细的介绍Android是如何处理NDEF格式的标签的当Android设备扫描到包含NDEF格式数据的NFC标签时,它会解析该消息,并尝试搞清楚数据的MIME类型或URI标识首先系统会读取消息(NdefMessage)中的第一条NdefRecord,来判断如何解释整个NDEF消息(一个NDEF消息能够有多条NDEF记录)。 在格式良好的NDEF消息中,第一条NdefRecord包含以下字段信息:

1)3-bit TNF(类型名称格式)  指示如何解释可变长度类型字段,在下表1中介绍有效值。

2)可变长度类型  说明记录的类型,如果使用TNF_WELL_KNOWN,那么则使用这个字段来指定记录的类型定义(RTD)。在下表2中定义了有效的RTD值。

3)可变长度ID    唯一标识该记录。这个字段不经常使用,但是,如果需要唯一的标识一个标记,那么就可以为该字段创建一个ID。

4)可变长度负载  你想读/写的实际的数据负载。一个NDEF消息能够包含多个NDEF记录,因此不要以为在NDEF消息的第一条NDEF记录中包含了所有的负载。

标签调度系统使用TNF和类型字段来尝试把MIME类型或URI映射到NDEF消息中。如果成功,它会把信息跟实际的负载一起封装到ACTION_NEDF_DISCOVERED类型的Intent中。但是,会有标签调度系统不能根据第一条NDEF记录来判断数据类型的情况,这样就会有NDEF数据不能被映射到MIME类型或URI,或者是NFC标签没有包含NDEF开始数据的情况发生。在这种情况下,就会用一个标签技术信息相关的Tag对象和封装在ACTION_TECH_DISCOVERED类型Intent对象内部的负载来代替。

表1.介绍标签调度系统映射如何把TNF和类型字段映射到MIME型或URI上。同时也介绍了那种类型的TNF不能被映射到MIME类型或URI上。这种情况下,标签调度系统会退化到ACTION_TECH_DISCOVERED类型的Intent对象。

例如,如果标签调度系统遇到一个TNF_ABSOLUTE_URI类型的记录,它会把这个记录的可变长度类型字段映射到一个URI中。标签调度系统会把这个URI跟其他相关的标签的信息(如数据负载)一起封装到ACTION_NDEF_DISCOVERED的Intent对象中。在另一方面,如果遇到了TNF_UNKNOWN类型,它会创建一个封装了标签技术信息的Intent对象来代替。

有以下3个附加功能: 
1.可以当成POS机来用,也就是“读取”模式  
2.可以当成一张卡来刷,也就是NFC技术最核心的移动支付功能 
3.可以像蓝牙、Wi-Fi一样做点对点通信

NFC通信总是由一个发起者 (initiator)和一个接受者(target)组成。通常initiator 主动发送电磁场(RF)可以为被动式接受者(passive target)提供电源。其工作的基本原理和收音机类似。正是由于被动式接受者可以通过发起者提供电源,因此target 可以有非常简单的形式,比如标签,卡,sticker 的形式。

NFC 也支持点到点的通信(peer to peer) 此时参与通信的双方都有电源支持。

和其它无线通信方式如Bluetooth相比,NFC 支持的通信带宽和距离要小的多,但是它成本低,如价格标签可能只有几分钱,也不需要配对,搜寻设备等,通信双方可以在靠近的瞬间完成交互。

Android NFC 应用中,Android手机通常是作为通信中的发起者也就是作为NFC的读写器。Android手机也可以模拟作为NFC通信的接受者且从Android 2.3.3起也支持P2P通信。

Android对NFC的支持主要在 android.nfc 和android.nfc.tech 两个包中。

android.nfc 包中主要类如下:

· NfcManager 可以用来管理Android设备中指出的所有NFC Adapter,但由于大部分Android设备只支持一个NFC Adapter,可以直接使用getDefaultAapater 来获取系统支持的Adapter。

· NfcAdapter 为一NFC Adapter 对象,可以用来定义一个Intent使系统在检测到NFC Tag时通知你定义的Activity,并提供用来注册forground tag 消息发送的方法等。

· NdefMessage 和NdefRecord NDEF 为NFC forum 定义的数据格式。

Tag 代表一个被动式Tag对象,可以代表一个标签,卡片,钥匙扣等。当Android设备检测到一个Tag时,会创建一个Tag对象,将其放在Intent对象,然后发送到相应的Activity。

android.nfc.tech 中则定义了可以对Tag进行的读写操作的类,这些类按照其使用的技术类型可以分成不同的类如:NfcA, NfcB, NfcF,以及MifareClassic 等。

Android应用程序框架

Android系统架构

Android Intent-Filter

Android NFC开发环境

硬件环境:

软件环境:

-

Android NFC API

Android.nfc主要类和主要接口:

Android.nfc.tech 主要类和主要接口

Android NFC 框架

Android系统中集成NFC硬件方法

NFC开发的基础

NFC开发的步骤:

Android NFC API 使用第一步

 

 

一、在清单文件配置以下三个重要的配置

<!--开发nfc的权限-->
1. 
<uses-permission android:name="android.permission.NFC"/>
 <!--声明只有带有nfc功能的手机才能下载你在google市场发布的具有NFC功能的app-->
 2.
<uses-feature android:name="android.hardware.nfc"
     android:required="true"
     
/>

3.支持的最小的sdk: minSdkConfig 10 .

二、NFCAdapter获取:

private NfcAdapter mNfcAdapter =null;//1.声明一个nfc的Adapter
  
@Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
  }
//2.检测NFC的检测函数
  
private void NfcCheck(){
      mNfcAdapter= NfcAdapter.getDefaultAdapter(this);//3.获取nfc适配器
  
if(mNfcAdapter==null){
      return//3.如果获取的mNfcAdapter=null,则说明该手机不支持nfc功能
  
}else{//4.如果手机有nfc功能,进一步判断nfc是否打开
      //5.假如手机的nfc功能没有被打开。则跳到打开nfc功能的界面
      
if(!mNfcAdapter.isEnabled()){
      Intent setNfc= new Intent(Settings.ACTION_NFC_SETTINGS);
       startActivity(setNfc);
      }
  }

三、NFC标签调用系统

NFC前台调度系统:是一种用于在运行的程序中,来处理NFC tag的技术。就是允许在用户手机最前端的Activity中来拦截系统发送的Intent对象。

包括两个API:

EnableForegroundDispatch:一般放在Activity的on Resume()方法里,呈现在用户界面的最前面。

disableForegroundDispatch:一般放在Activity的on Pause()方法里,

NFC标签调度系统

NFC Intent 过滤器

Android AAR

Android NFC开发详细总结相关推荐

  1. Android NFC开发概述

    NFC手机相比普通手机来说,有以下3个附加功能:  1.可以当成POS机来用,也就是"读取"模式   2.可以当成一张卡来刷,也就是NFC技术最核心的移动支付功能  3.可以像蓝牙 ...

  2. 《Android NFC开发实战详解》——6.4节Android NFC P2P开发进阶

    本节书摘来自异步社区<Android NFC开发实战详解>一书中的第6章,第6.4节Android NFC P2P开发进阶,作者 赵波,更多章节内容可以访问云栖社区"异步社区&q ...

  3. Android NFC开发实战详解

    Android NFC开发实战详解 Android开发实战详解NFC国内第一本AndroidNFC开发书籍带你开启AndroidNFC开发的神秘之旅大综合案例帮助读者快速进入实战角色:WiFi快速连接 ...

  4. android nfc ndef mifareclassic,Android NFC开发-实践篇

    Android NFC开发-实践篇 https://blog..net/_GYG/article/details/72899417 在Android NFC开发-理论篇中,我们了解了在Android中 ...

  5. Android NFC开发-实践篇

    Android NFC开发-实践篇 在Android NFC开发-理论篇中,我们了解了在Android中开发NFC的一些理论知识,这篇我们继续应用我们上一篇学到的知识,实现对NDEF格式标签和Mifa ...

  6. Android NFC开发-理论篇

    Android NFC开发-理论篇 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/CSDN_GYG/article/details/72884849 ...

  7. Android NFC开发实战详解PDF

    最近找书做毕设,有的还要加会员注册什么的,下面是<Android NFC开发详解>和<第一行代码>,自取,不用谢,来波点赞呗 链接:https://pan.baidu.com/ ...

  8. 华为云IOT Android应用开发详细教程

    华为云IOT Android应用开发详细教程 (Android Studio开发) 第〇章    简介       大家好,上一期发布的教程叫大家如何利用华为云物联网平台提供的官方Java Demo去 ...

  9. android NFC 开发学习笔记(1)

    由于工作需求,最近在研究android nfc开发,借鉴了很对大神的文章在此记录自己的学习过程: 大家学习android开发建议首选android开发文档,该文档在你下载的sdk中,路径:/sdk/d ...

最新文章

  1. java mysql in_MySQL中Exists和In的使用
  2. python 切割字符串
  3. 压缩感知(III) A Compressed Sense of Compressive Sensing (III)
  4. 附近的人 php,php 附近的人
  5. Ajax跨域post请求后端无法获取登录态原因及解决办法
  6. shiro学习(13):springMVC结合shiro完成认证
  7. matlab 刻度非均匀控制,MATLAB 出一张好看的图
  8. ssh不能连接 提示WARNING: POSSIBLE DNS SPOOFING DETECTED!处理方法
  9. 嵌入式系统——曼彻斯特编码
  10. JavaScript:table元素行的添加和删除
  11. 群晖套件 Transmission 汉化
  12. 计算机磁盘怎么清理,电脑磁盘已满怎么清理_电脑磁盘不足怎么清理
  13. matlab哪些教材好,新手入门,恳请推荐一本matlab好教材
  14. 公有云、私有云、混合云
  15. 【论文阅读】去偏、缓解数据稀疏的多任务因果推荐CVR优化
  16. AlphaGo人肉臂黄士杰:我的使命完成 阿尔法狗项目结束 | 重磅
  17. 计算机专业的会修电脑吗,常被错误理解的三大专业,计算机专业会修电脑,机械工程很是离谱...
  18. 正则系列2: re.search用法
  19. ATV 开发 二 、内置gtvs
  20. 软件测试 | 测试开发 | Git实战(四)| Git分支管理实操,在线合并和本地合并

热门文章

  1. 当集合a为空集时a的取值范围_1.2 集合间的基本关系20202021学年高一数学新教材配套学案(人教A版必修第一册)...
  2. java mail 503_邮件配置报503错误,发送失败
  3. html定位一个元素,css元素定位
  4. 【LeetCode】【HOT 100】2. 两数相加
  5. 《Reids 设计与实现》第十二章 复制
  6. tcp、http协议的长连接和短连接
  7. JavaScript tab页
  8. 使用InternalsVisibleToAttribute给assembly添加“友元assembly”特性遭遇强签名
  9. Ubuntu 16.04关闭Alt+鼠标左键移动窗口(转)
  10. js添加事件 attachEvent 和addEventListener的用法