想要学习Android的NFC模块,首先要了解,什么是NFC,NFC是怎么来的

首先我们先了解ID IC RFID  NFC Mifare卡各种概念的关系

1. IC和ID卡的区别:

ID卡仅仅记录卡号,卡内的卡号读取无任何权限,易于仿制. ID卡不可写入数据,其记录内容(卡号)只可由芯片生产厂一次性写入,开发商可读出卡号加以利用,无法根据系统的实际需要制订新的号码管理制度.  IC卡内所记录数据的读取,写入均需相应的密码认证,甚至卡片内每个区均有不同的密码保护,全面保护数据安全,IC卡写数据的密码与读出数据密码可设为不同,提供了良好分级管理方式,确保系统安全.IC卡不仅可由授权用户读出大量数据,而且亦可由授权用户写入大量数据(如新的卡号,用户的权限,用户资料等),IC卡所记录内容可反复擦写. IC卡的安全性远大于ID卡.

2.IC卡和RFID

卡的区别IC卡分为接触式和非接触式IC卡,都属于RFID范畴,接触式IC卡其芯片直接封装在卡基表面,而非接触式IC卡是由芯片和线圈组成,可分为

COB绕  铜  线、蚀  刻 天 线  、印刷天线等等,两者的应用区别在于:前者在使用过程中需要插入读卡器使用,例如银行卡,后者仅需要靠近读卡器感应天线就能被读取,例如交通卡、门禁卡。

RFID卡是指非接触式类电子卡片/标签,包括有ID卡、IC卡和NFC卡以及其它等电子卡/标签。他们主要的区别在于工作频段。

ID卡是早期的非接触式电子标签,工作频段在125kHz只有一个ID号,不可以存储任何数据,故叫ID卡。

IC卡如从字义上面理解,是包括了除ID卡外的其它RFID电子标签和接触式的芯片卡,不过一般说IC卡主要是指工作于13.56MHz频段的非接触式智能卡和接触式智能卡,而非接触式智能卡也就包括了NFC卡片或标签(NFC论坛规定有四种卡片类型属于NFC卡片),接  触  式  智能卡也就是带个裸露芯片的智能卡。

RFID卡还包括其它工作频段的电子卡/标签,如915MHz,2.4GHz等频段。

3.RFID卡和NFC卡的区别

NFC是在RFID的基础上发展而来,NFC从本质上与RFID没有太大区别,都是基于地理位置相近的两个物体之间的信号传输。

但NFC与RFID还是有区别的,NFC技术增加了点对点通信功能,可以快速建立蓝牙设备之间的P2P(点对点)无线通信,NFC设备彼此寻找对方并建立通信连接。P2P通信的双方设备是对等的,而RFID通信的双方设备是主从关系。

其余还有一些技术细节方面:

NFC相较于RFID技术,具有距离近、带宽高、能耗低等一些特点。详细内容:

1.NFC只是限于13.56MHz的频段!而RFID的频段有低频(125KHz到135KHz),高频(13.56MHz)和超高频(860MHz到960MHz之间。

2.工作有效距离:NFC(小于10cm,所以具有很高的安全性),RFID距离从几米到几十米都有!

3.因为同样工作于13.56MHz,NFC与现有非接触智能卡技术兼容,所以很多的厂商和相关团体都支持NFC,而

RFID标准较多,统一较为复杂(估计是没可能统一的了),只能在特殊行业有特殊需求下,采用相应的技术标准!

4.应用:RFID更多的被应用在生产、物流、跟踪、资产管理上,而NFC则在门禁、公交、手机支付等领域内发挥着巨大的作用。

4.Mifare系列卡区别

Mifare系列卡pain根据卡内使用芯片不同分为

Miare UltraLight 又称为MF0

Mifare S50和S70,又称为MF1

Mifare Pro 又称为MF2

Mifare DesFire 又称为MF3

Mifare 1 有密码 Mifare UltraLight没有密码

M1/ML/UltraLight/Mifare Pro 都遵守14443A协议,AT88RF020遵守14443B

Mifare S50和S70的区别:

一是读写器对卡片发出请求命令,二者应答返回的卡类型(ATQA)字节不同, S50的卡类型是0004H,S70的卡类型是0002H,另一个区别就是二者容量和内存结构不同,S50容量是1K字节,S70容量是4K字节

不知道看到这里,还有没有看下去的勇气,以上的内容也是我从网上找的,感觉说的还是比较详细的,最起码这些卡的分类和区别能让我有一个基本的认识,下面就说说Android系统的NFC模块

首先你得有一个有NFC模块的手机或者平板,华为、小米、三星等

NFC的TAG分发:

打开NFC功能,保持屏幕点亮并且要解锁屏幕

当系统检测到一个NFC标签的时候,他会自动去寻找最合适的activity去处理这个intent.

他所发出的这个Intent将会有三种action:

ACTION_NDEF_DISCOVERED:当系统检测到tag中含有NDEF格式的数据时,且系统中有activity声明可以接受包含NDEF数据的Intent的时候,系统会优先发出这个action的intent。

ACTION_TECH_DISCOVERED:当没有任何一个activity声明自己可以响应ACTION_NDEF_DISCOVERED时,系统会尝试发出TECH的intent.即便你的tag中所包含的数据是NDEF的,但是如果这个数据的MIMEtype或URI不能和任何一个activity所声明的想吻合,系统也一样会尝试发出tech格式的intent,而不是NDEF.

ACTION_TAG_DISCOVERED:当系统发现前两个intent在系统中无人会接受的时候,就只好发这个默认的TAG类型的

Android的androidManifest文件配置权限

<uses-permissionandroid:name="android.permission.NFC"/>

然后是sdk级别限制:<uses-sdkandroid:minSdkVersion="10"/> 10以上

接着是特殊功能限制 <uses-featureandroid:name="android.hardware.nfc"android:required="true"/>这个可以让你的应用在googleplay上被声明使用者必须拥有nfc功能

NFC标签过滤

在activity的intent过滤xml声明中,你可以同时声明过滤这三种action.但是由之前所说,你应该知道系统在发送intent的时候是有优先级的,所以你最好清楚自己最想处理哪个。

1:过滤ACTION_TAG_DISCOVERED:

    <intent-filter>       <action android:name="android.nfc.action.TAG_DISCOVERED"/>       <category android:name="android.intent.category.DEFAULT"/>
     <data android:mimeType="text/plain" />
     </intent-filter>
这个最简单,也是最后一个被尝试接受intent的选项
data的mimeType类型了,这个定义的越准确,intent指向你这个activity的成功率就越高,否则系统可能不会发出你想要的NDEF intent了
过滤ACTION_TECH_DISCOVERED:
你首先需要在你的<project-path>/res/xml下面创建一个过滤规则文件。名字任取,比如可以叫做nfc_tech_filter.xml。这个里面定义的是nfc实现的各种标准,每一个nfc卡都会符合多个不同的标准,个人理解为这些标准有些相互之间也是兼容的。你可以在检测到nfc标签后使用getTechList()方法来查看你所检测的tag到底支持哪些nfc标准。
一个nfc_tech_filter.xml中可以定义多个<tech-list>结构组。每一组代表我声明我只接受同时满足这些标准的nfc标签。比如A组表示,只有同时满足IsoDep,NfcA,NfcB,NfcF这四个标准的nfc标签的intent才能进入。A与B组之间的关系就是只要满足其中一个就可以了。换句话说,你的nfc标签技术,满足A的声明也可以,满足B的声明也可以。
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list> --------------------------------A组
<tech>android.nfc.tech.IsoDep</tech> <tech>android.nfc.tech.NfcA</tech>   <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.NfcF</tech>
</tech-list>
<tech-list>-----------------------------------------B组
<tech>android.nfc.tech.NfcV</tech> <tech>android.nfc.tech.Ndef</tech> <tech>android.nfc.tech.NdefFormatable</tech> <tech>android.nfc.tech.MifareClassic</tech> <tech>android.nfc.tech.MifareUltralight</tech>
 </tech-list>
</resources>

在androidManifest文件中声明xml过滤的举例如下

<activity>
 <intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>
<meta-data android:name="android.nfc.action.TECH_DISCOVERED"      android:resource="@xml/nfc_tech_filter" />-------------这个就是你的资源文件名
 </activity>
nfc标签前台分发系统
之所以把他也归类在nfc的过滤里面,主要是因为他跟解析nfc标签到不是那么的紧密,他解决的是接受哪些nfc标准的标签问题。所以更接近nfc的过滤。
什么叫nfc的前台发布系统?就是说当我们已经打开我们的应用的时候,那么通过这个前台发布系统的设置,我们可以让我们已经启动的activity拥有更高的优先级来依据我们在代码中定义的标准来过滤和处理intent,而不是让别的声明了intentfilter的activity来干扰,甚至连自己声明在androidManifest中的intent
filter都不会来干扰。也就是说foreground Dispatch的优先级大于intent filter。
第一种情况:当你的activity没有启动的时候,去扫描tag,那么系统中所有的intent filter都将一起参与过滤。
第二种情况:当你的actiity启动了,去扫描tag时,那么将直接使用你在foreground dispatch中代码写入的过滤标准。如果这个标准没有命中任何intent,那么系统将使用所有activity声明的intent filter xml来过滤。
在OnCreate中你可以添加如下代码
// Create ageneric PendingIntent that will be deliver to this activity. The NFC
stack will fill in the intent with the details of the discovered tag
before delivering to this activity.
   mPendingIntent = PendingIntent.getActivity(this, 0,            new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);              // 做一个IntentFilter过滤你想要的action 这里过滤的是ndef       IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
//如果你对action的定义有更高的要求,比如data的要求,你可以使用如下的代码来定义intentFilter//        try {//            ndef.addDataType("*/*");//        } catch (MalformedMimeTypeException e) {//            // TODO Auto-generated catch block//            e.printStackTrace();//        }    //生成intentFilter          mFilters = new IntentFilter[] {               ndef,       };              // 做一个tech-list。可以看到是二维数据,每一个一维数组之间的关系是或,但是一个一维数组之内的各个项就是与的关系了       mTechLists = new String[][] {                new String[] { NfcF.class.getName()},               new String[]{NfcA.class.getName()},               new String[]{NfcB.class.getName()},               new String[]{NfcV.class.getName()}               };
在onPause和 onResume中需要加入相应的代码。
public void onPause() {
 super.onPause();
//反注册 mAdapter.disableForegroundDispatch(this);
}

 public void onResume() {
 super.onResume();
//设定intentfilter和tech-list。如果两个都为null就代表优先接收任何形式的TAG action。也就是说系统会主动发TAG intent。
mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists);
}

Android-NFC模块学习(1)相关推荐

  1. Android nfc模块读写MifareClassic卡50

     http://3y.uu456.com/bp_8mhvy4gizz721et5ih0i_1.html 一般来说,基于MifareClassic的射频卡:1K:16个分区(sector),每个分区 ...

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

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

  3. android fm模块学习,AndroidFM模块学习之5关闭FM流程

    AndroidFM模块学习之五关闭FM流程 前一阵子简单描述了一些关于FM开启.录音和搜索的流程,浅析了一下各个类的源码,接下来就是关闭FM了,FM模块的学习就告一段落了,希望这阵子的整理能对大家在F ...

  4. Android FM模块学习之一 FM启动流程

    转自:http://blog.csdn.net/tfslovexizi/article/details/41283743 最近在学习FM模块,FM是一个值得学习的模块,可以从上层看到底层.上层就是FM ...

  5. Android Bluetooth模块学习笔记

    一.蓝牙基础知识 1.蓝牙( Bluetooth )是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换.蓝牙基于设备低成本的收发器芯片,传输距离近.低功耗. 2.微波频段: ...

  6. android4.2 音频模块启动分析,Android 音频模块学习小结

    现在移动端已不仅仅局限于文本.图片这些 pc 平台上的常见信息类型,语音的使用愈见频繁,于是前段时间萌生了个想法:如果在移动端对语音内容做处理,提取特征出来构建关键词库是否可以对这些语音进行分类.搜索 ...

  7. Android FM模块学习之四源码解析(一)

    前一章我们了解了FM手动调频,接下来我们要分析FM模块用到的源码.此源码是基于高通平台的,别的平台都大同小异,只不过是平台自己作了些小改动而已. 首先要看的当然是主activity, FMRadio. ...

  8. Android FM 模块学习之四 源码解析(1)

    前一章我们了解了FM手动调频,接下来我们要分析FM模块用到的源码.此源码是基于高通平台的,别的平台都大同小异,只不过是平台自己作了些小改动而已. 首先要看的当然是主activity, FMRadio. ...

  9. Android FM模块学习之四源码分析(五)

    前几章我们分析了FM模块的几个主要的类文件,今天要分析的是:FMTransceiver.java public class FmTransceiver {/* Primary FM States :* ...

  10. Android FM模块学习之四源码学习(2)

    前几章我们分析了FM模块的几个主要的类文件,今天要分析的是:FMTransceiver.java   // 某些工程中名称为FMRadioService.java public class FmTra ...

最新文章

  1. 爬虫网页搜索策略的选择
  2. python获取matplotlib、tensorflow、pandas、numpy等的版本version
  3. 利用python opencv实现图像自适应二值化
  4. python二次开发攻略-ABAQUS Python二次开发攻略
  5. Spring 事务机制详解
  6. boost::fusion::detail::and_用法的测试
  7. 专精开发还是转管理?程序员的职业规划选择,没有想象中那么难
  8. 雷达多普勒频率计算公式_手持式雷达流速仪的监测应用方案
  9. linux命令无视错误,llinux 的一些命令和错误
  10. MBA 案例:一个叫花子做的策划
  11. 静态内部类实现单例_为什么用枚举类来实现单例模式越来越流行?
  12. python实现乘法口诀表
  13. BLUES吉他学习笔记007 bluesrv[11]
  14. python的江湖世界
  15. 联想H61主板升级BIOS,支持nvme硬盘
  16. 美丽的小丑,谁的悲哀
  17. Synchronized锁升级底层原理
  18. AHCI导致启动win7蓝屏的解决
  19. python项目中的.idea文件夹是干什么的
  20. 【深度学习】(ICCV-2021)PVT-金字塔 Vision Transformer及PVT_V2

热门文章

  1. 金融行业选用UPS不间断电源
  2. 获取Android设备的唯一识别码|设备号|序号|UUID
  3. 把计算机信息传到电视屏的方法,如何将电脑内容投屏到电视上?当贝市场完整版教程...
  4. 【Spring】Jasper入门
  5. MUI tabbar购物车小图标的制作
  6. Unity与安卓交互 | Unity2019.3版本之后,在Android Studio中写代码导出aar包与Unity中使用交互的方法
  7. 2020年综合评价备考全知道(附31所综合评价院校名单)
  8. java母子年龄计算,小明12岁了,妈妈的年龄比小明大20岁,请问几年后妈妈的年龄是小明的两倍。
  9. win10系统 鼠标放在开始或者任务栏就一直转圈圈
  10. docker容器Linux环境下二维码图片中文字体乱码处理办法