- 浏览: 258746 次
- 性别:
- 来自: 深圳
最新评论
-
whizkid:
[img] private void enableNdefEx ...
android通过NFC读写数据 -
zhangminglife:
您好!不错,最近正在弄这个东西,能否把demo发给我一份谢谢了 ...
SSL双向认证java实现(转) -
water卡:
android如何调用显示和隐藏系统默认的输入法 -
water卡:
android如何调用显示和隐藏系统默认的输入法 -
sjp524617477:
good
生成android使用的BKS证书
NFC概述
-
NFC是短距离的无线通信,通常距离是4厘米或更短。
-
NFC工作频率是13.56M Hz,传输速率是106kbit/s到 848kbit/s。
-
NFC总是在一个发起者和一个被动目标之间发生。发起者发出近场无线电波,这个近场可以给被动目标供电。这些被动的目标包括不需要电源的标签,卡,也可以是有电源的设备。
相比其他无线通信技术,如蓝牙和WiFi,NFC带宽更低,通信距离更短,低成本,不需要供电,不需要实现匹配,整个通信过程仅仅是短短的靠近一秒就能完成。
一个带有NFC支持的android设备通常是一个发起者。也可以作为NFC的读写设备。他将检测 NFC tags并且打开一个Activity来处理。Android 2.3.3还有支持有限的P2P(点对点传输) 。
Tag分很多种,其中简单的只提供读写段,有的只能读。复杂的tag可以支持一些运算,加密来控制对tag里数据段的读写。甚至一些tag上有简单的操作系统,允许一些复杂的交互和可以执行一些代码。
更多信息参见NFC资料收集
Android API概览
Android.nfc包
包含顶层类用来与本地NFC适配器交互。这些类可以表示被检测到的tag和NDEF数据。
NfcManager | NFC适配器的管理器,可以列出所有此Android设备支持的NFC适配器。不过大部分Android设备只有一个NFC适配器,所以大部分情况下可以直接用静态方法getDefaultAdapter(context)来取适配器。 |
NfcAdapter | 表示本设备的NFC适配器,可以定义Intent请求将系统检测到tag的消息发送到Activity,并提供方法注册前台tag消息发布和前台NDEF推送。前台NDEF推送是目前Android版本唯一支持的p2p NFC通信方式。 |
NdefMessage NdefRecord |
NDEF是NFC论坛定义的数据结构,用来有效的存数据到NFC tag。如文本,URL,和其他MIME类型。NdefMessage扮演一个容器,这个容器存那些发送和读到的数据。一个NdefMessage对象包 含0或多个NdefRecord,每个NdefRecord有一个类型,如文本,URL,智能海报/广告,或其他MIME数据。在NdefMessage 里的第一个NfcRecord的类型用来发送tag到一个Android设备上的activity。 |
Tag | 标示一个被动的NFC目标,比如tag,card,钥匙挂 扣,甚至是一个电话模拟的的NFC卡。当一个tag被检测到,tag对象将被创建并且封装到一个Intent里,然后NFC发布系统会将这个Intent 用startActivity发送到注册了接受这种Intent的activity里。可以用getTechList()方法来得到这个tag支持的技术 细节和创建一个android.nfc.tech提供的相应的TagTechnology对象。 |
android.nfc.tech包
包含那些对tag查询属性和进行I/O操作的类。这些类分别标示一个tag支持的不同的NFC技术标准。
TagTechnology | 这个接口是下面所有tag technology类必须实现的。 |
NfcA | 支持ISO 14443-3A Nfc-A标准的属性和操作 |
NfcB | 支持ISO 14443-3A Nfc-B标准的属性和操作 |
NfcF | 支持JIS 6319-4 Nfc-F的属性和操作 |
NfcV | 支持ISO 15693 NFC-V标准的属性和操作 |
IsoDep | 支持ISO-DEP(ISO 14443-4)标准的属性和操作 |
Ndef | 提供NDEF格式的tag数据的访问和其他操作。 |
NdefFormatable | 对可以被格式化成NDEF格式的tag提供一个格式化的操作 |
MifareClassic | 如果Android设备支持MIFARE,提供对MIFARE Classic目标的属性和I/O操作。 |
MifareUltralight | 如果android设备支持MIFARE,提供对MIFARE Ultralight目标的属性和I/O操作。 |
权限声明
在AndroidManifest.xml中:
-
NFC使用 <uses-permission> 元素来访问NFC硬件:
<uses-permission android:name="android.permission.NFC" />
-
最小SDK版本需要设置正确:
<uses-sdk android:minSdkVersion="10"/>
-
API level 9只包含有限的tag支持,包括:
-
通过ACTION_TAG_DISCOVERED来发布Tag信息
-
只有通过EXTRA_NDEF_MESSAGES扩展来访问NDEF消息
-
其他的tag属性和I/O操作都不支持
-
-
API level 10可以实现对tag的广泛的读写支持。
-
-
uses-feature元素定义:
<uses-feature android:name="android.hardware.nfc" android:required="true" />
intent-filter设置
NFC intent filter告诉Android系统该Activity能处理NFC数据,可以定义1个或多个intent filter:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <data android:mimeType="mime/type" /> </intent-filter> <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED"/> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter.xml" /> </intent-filter> <intent-filter> <action android:name="android.nfc.action.TAG_DISCOVERED"/> </intent-filter>
上边3个intent filters有优先级,更多信息可以看下面的Tag发布系统。
Tag发布系统
当Android设备扫描到一个NFC tag,一般的行为是自动找出会处理这个tag Intent的最合适的Activity,而不需要用户来选择用哪个Activity来处理。因为设备扫描NFC tag的范围和时间都很短,如果让用户选择,就有可能需要移动设备,这样将会打断这个扫描过程。应该开发只处理需要处理的tags的Activity,防 止出现让用户选择使用哪个Activity来处理的情况。
Android提供两个系统来正确的识别一个NFC tag是否是Activity想要处理的:
-
Intent发布系统
-
前台发布系统。
Intent发布系统
Intent发布系统检查所有Activity的intent filters,找出那些定义了可以处理此tag的Activity,如果有多个Activity都配置了处理同一个tag Intent,那么将使用Activity选择器来让用户选择使用哪个Activity。用户选择之后,将使用选择的Activity来处理此 Intent.
前台发布系统
前台发布系统允许一个Activity覆盖掉Intent发布系统而首先处理此tag Intent,要求将要处理Tag Intent的Activity运行在前台,当一个NFC tag被扫描到时,系统会先检测前台的Activity是否支持处理此Intent,如果支持,即将此Intent传给此Activity,如果不支持, 则转到Intent发布系统。
使用Intent发布系统
Intent发布系统指定的3个intent有不同的优先级。通常当一个tag被检测到之后,Intent就被启动(start)了,这个启动遵循以下行为:
-
android.nfc.action.NDEF_DISCOVERED:
这个intent在一个包含NDEF负载的tag被检测到时启动,这是最高优先级的intent, Android系统不会让一个Intent能处理所有的NFC数据类型,必须在AndroidManifest.xml中指定与NFC tag对应的<data>元素,这样当扫描到的tag传过来的数据类型与定义的相匹配时,Activity就会被调用。例如想处理一个包含 plain text的NDEF_DISCOVERED intent ,要按照如下定义AndroidManifest.xml:<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <data android:mimeType="text/plain" /> </intent-filter>
如果NDEF_DISCOVERED intent已经被启动,TECH_DISCOVERED和TAG_DISCOVERED intent将不会被启动。假如一个未知的tag或者不包含NDEF负载的tag被检测到,此Intent不会被启动。
-
android.nfc.action.TECH_DISCOVERED:
如果NDEF_DISCOVERED intent没启动或者没有一个Activity的filter检测NDEF_DISCOVERED ,并且此tag是已知的,那么此TECH_DISCOVERED Intent将会启动。TECH_DISCOVERED intent要求在一个资源文件里(xml)指定支持技术列表。 -
android.nfc.action.TAG_DISCOVERED:
如果没有Activity处理 NDEF_DISCOVERED和TECH_DISCOVERED intents或者tag被检测为未知的,那么此Intent将会被启动。
指定可处理的类型
假如Activity在AndroidManifest.xml文件里声明了处理android.nfc.action.TECH_DISCOVERED intent ,则必须创建一个Xml格式的资源文件,并加上Activity支持的技术到tech-list集合里。这样Activity将被认作能处理这些 tech-list的处理者,如果tag使用的技术在定义的列表里,Activity将接收此Intent。可以用getTechList()来获得 tag支持的技术。
例如:如果一个tag被检测到支持MifareClassic, NdefFormatable, 和 NfcA,tech-list集合必须指定了其中的一项或者多项来告诉系统该Activity能处理此Intent。
下面是一个资源文件例子,定义了所有的技术。可以根据需要删掉不需要的项,将此文件以任意名字+.xml保存到<project-root>/res/xml文件夹。
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <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>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>
也可以指定多个tech-list集合,每个集合都认做独立的。如果任何单个tech-list集合是getTechList()返回的技术集合的子集, 那么该Activity将被认为匹配了。系统还提供“与”和“或”操作。下面的例子表示支持NfcA和NDef的卡,或者支持NfcB和NDef的卡:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.Ndef</tech> </tech-list> </resources> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.Ndef</tech> </tech-list> </resources>
使用前台发布系统
前台发布系统允许一个Activity拦截tag Intent 获得最高优先级的处理,这种方式可以用下面的方法实现:
-
添加下列代码到Activity的onCreate() 方法里
-
创建一个PendingIntent对象, 这样Android系统就能在一个tag被检测到时定位到这个对象。
PendingIntent pendingIntent = PendingIntent .getActivity(this, 0, new Intent(this,getClass()) .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
-
在Intent filters里声明想要处理的Intent,一个tag被检测到时先检查前台发布系统,如果前台Activity符合Intent filter的要求,那么前台的Activity的将处理此Intent。如果不符合,前台发布系统将Intent转到Intent发布系统。如果指定了 null的Intent filters,当任意tag被检测到时,将收到TAG_DISCOVERED intent。因此请注意应该只处理想要的Intent。
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); try { ndef.addDataType("*/*"); }catch(MalformedMimeTypeException e) { throw new RuntimeException("fail", e); } intentFiltersArray = new IntentFilter[]{ndef,};
-
-
覆盖onPause()和onResume()方法来打开或关闭前台发布系统。必须在主线程里调用 enableForegroundDispatch(Activity, PendingIntent, IntentFilter[], String[][]), 而且Activity需在前台(可以在onResume()里调用来保证这点)。还要覆盖onNewIntent回调来处理得到的NFC tag数据。
public void onPause() { super.onPause(); mAdapter.disableForegroundDispatch(this); } public void onResume() { super.onResume(); mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray); } public void onNewIntent(Intent intent) { Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); //do something with tagFromIntent }
使用NFC tag上的数据
NFC tag上的数据以字节存放,可以将其转换成其他想要的格式。当往tag写东西时,必须以字节格式来写。Android提供API来写符合NDEF标准的信息,使用此标准能保证数据在往tag写时能被所有Android NFC设备支持。
很多tag使用他们自己的标准来存储数据,这些标准也被Android支持。但必须自己实现协议栈来读写这些tag。可以在android.nfc.tech里找到所有支持的技术,并且可以在TagTechnology接口里对该技术有个简单了解。
为了方便使用NDEF消息,Android用NdefRecord和NdefMessage包装原始字节数据为NDEF消息。一个NdefMessage 是保存0个或多个NdefRecords的容器,每个NdefRecord有自己的唯一类型名字格式,记录类型和ID来与其他记录区分开。可以存储不同类 型,不同的长度的记录到同一个NdefMessage。NFC tag容量的限制决定NdefMessage的大小。
支持Ndef和NdefFormatable技术的tag可以返回和接受NdefMessage对象为参数来进行读写操作。需要创建自己的逻辑来为其他在android.nfc.tech的tag技术实现读写字节的操作。
读NFC tag
当NFC tag靠近NFC设备时,相应的Intent将在设备上被创建。然后通知合适的程序来处理此Intent。下面的方法可以处理TAG_DISCOVERED intent并且使用迭代器来获得包含在NDEF tag负载中的数据。
NdefMessage[] getNdefMessages(Intent intent) { // Parse the intent NdefMessage[] msgs = null; String action = intent.getAction(); if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMsgs != null) { msgs = new NdefMessage[rawMsgs.length]; for (int i = 0; i < rawMsgs.length; i++) { msgs[i] = (NdefMessage) rawMsgs[i]; } } else { // Unknown tag type byte[] empty = new byte[] {}; NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty); NdefMessage msg = new NdefMessage(new NdefRecord[] {record}); msgs = new NdefMessage[] {msg}; } } else { Log.e(TAG, "Unknown intent " + intent); finish(); } return msgs; }
注意NFC设备读到的数据是byte类型,所以可能需要将他转成其他格式来呈现给用户。NFCDemo例子展示了怎样用com.example.android.nfc.record中的类来解析NDEF消息,比如纯文本和智能海报。
写NFC tag
往NFC tag写东西涉及到构造一个NDEF消息和使用与tag匹配的Tag技术。下面的代码展示怎样写一个简单的文本到NdefFormatable tag:
NdefFormatable tag = NdefFormatable.get(t); Locale locale = Locale.US; final byte[] langBytes = locale.getLanguage().getBytes(Charsets.US_ASCII); String text = "Tag, you're it!"; final byte[] textBytes = text.getBytes(Charsets.UTF_8); final int utfBit = 0; final char status = (char) (utfBit + langBytes.length); final byte[] data = Bytes.concat(new byte[] {(byte) status}, langBytes, textBytes); NdefRecord record = NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data); try { NdefRecord[] records = {text}; NdefMessage message = new NdefMessage(records); tag.connect(); tag.format(message); } catch (Exception e){ //do error handling }
点对点数据交换
前台推送技术支持简单点对点的数据交换,可以用enableForegroundNdefPush(Activity, NdefMessage)方法来打开此功能。
使用此功能需要满足以下条件:
-
推送数据的Activity必须是前台Activity。
-
必须将要发送的数据封装到NdefMessage对象里。
-
接收推送数据的设备必须支持com.android.npp NDEF推送协议,这对于Android设备是可选的。
假如Activity打开了前台推送功能并且位于前台,这时标准的Intent发布系统是禁止的。然而,如果Activity允许前台发布系统,那么此时检测tag的功能仍然是可用的,不过只适用于前台发布系统。
要打开前台推送需要:
-
创建一个要推送给其他NFC设备的包含NdefRecords的NdefMessage。
-
在Activity里覆盖onResume()和onPause()的回调来正确处理前台推送的生命周期。必须在Activity位于前台并在主线程里调 用enableForegroundNdefPush(Activity, NdefMessage) (可以在onResume()里调用来保证这点)。
public void onResume() { super.onResume(); if (mAdapter != null) mAdapter.enableForegroundNdefPush(this, myNdefMessage); } public void onPause() { super.onPause(); if (mAdapter != null) mAdapter.disableForegroundNdefPush(this); }
当Activity位于前台,可以靠近另外一个NFC设备来推送数据。可参考例子ForegroundNdefPush来了解点对点数据交换。
发表评论
-
PBOC规范研究之六、变长记录文件
2014-08-14 20:11 947PBOC规范研究之六、变长记录文件 此博文包含图片 (20 ... -
Windows桌面共享中一些常见的抓屏技术
2014-06-06 15:01 10811. BitBlt 我想做Windows开 ... -
Android APK 签名比对
2014-04-10 14:11 666发布过Android应用的朋友 ... -
Android小知识点
2014-04-10 09:45 7091、 最近翻看以前的项目时候,想更改下布局文件,谁知道就改了 ... -
error C2440 “static_cast” 无法从“void (__thiscall )(void)”转换为“LRESULT
2013-11-18 13:51 1570error C2440 “static_cast” 无法从 ... -
WOSA/XFS结构、背景等介绍
2013-11-14 13:28 1236前言: 写给 ... -
查看oracle用户数据库连接数
2013-10-30 12:31 685查看oracle用户数据库连接数 1、查询oracle的连接 ... -
Android 获取基站信息
2013-10-18 10:39 1058Android 基站分CdmaCellLocation和Gsm ... -
几种穿透防火墙技术
2013-07-12 18:28 1025本人对几种穿透防火墙技术 以下是本人对几种穿透技术学习笔记和一 ... -
C# Socket编程笔记
2013-06-16 08:58 0看到这个题目,是不是 ... -
金融行业密钥详解
2013-05-15 16:48 944金融行业因为对数据比较敏感,所以对数据的加密也相应的比较重视。 ... -
Android 打开PDF,PPT,WORD,EXCEL,CHM,HTML,TEXT,AUDIO,VIDEO 格式文件代码
2013-03-15 16:42 1803import android.app.Activity; im ... -
Android平板上开发App的准则
2013-03-14 11:38 11101、保证符合App的通用开发准则 在谈Android平板A ... -
rdp delphi实现远程桌面
2012-11-11 00:17 76571. 首先确保你的机器上存在mstscax.dll,如果没有这 ... -
xml通配符
2012-11-09 09:33 2460解析xml字符串 < -> < &g ... -
cobol中常用的数据类型
2012-08-22 15:13 1282COBOL上的基本类型大致分为:常量、变量、直接数和结构体。下 ... -
(转)学习maven的使用,看到一篇很实用的入门教程(菜鸟级入门)
2012-07-12 15:19 865一、前言 早 ... -
android程序发布时的常用工具
2012-07-12 14:38 10571.为应用程序设定版本,在应用程序清单文件中设置。 ... -
java CA证书相关操作,Android,java
2012-06-11 16:16 3472一:需要包含的包 import java.securi ... -
Android PhoneGap简析
2012-05-22 10:52 3757前言 上周研究了一下Pho ...
相关推荐
### NFC商业模型研究 #### 一、引言 在当今数字化时代背景下,移动商务作为一种新型的电子商务形式,凭借其移动性和便捷性获得了广泛的关注和发展。然而,随着移动终端设备的日益普及和技术的进步,如何克服现有...
此“安卓NFC相关-AndroidNFC客户端读写.rar”资源包含了一个Android应用,用于演示如何在客户端进行NFC标签的读取与写入操作。下面我们将深入探讨NFC的基本概念、Android中的NFC API以及如何实现NFC读写功能。 1. *...
从提供的压缩包文件名称来看,我们可以深入探讨以下几个NFC相关的知识点: 1. **NFC在移动支付的应用**:如“NFC技术应用_谷歌用于移动支付街旁用于签到.pdf”,这表明NFC在移动支付领域有广泛应用。谷歌利用NFC...
### NFC芯片与SIM卡连接方案研究 #### 摘要 随着近场通信(NFC)技术的快速发展,以及移动运营商对于NFC...此外,还需要加强跨行业合作,推动相关标准的制定和完善,以促进NFC技术在移动支付和其他领域的广泛应用。
总的来说,这个“nfc相关资料和代码”大礼包可能包含有关如何在Android平台上开发NFC应用的教程、示例代码、API文档等资源,对于想要学习和掌握NFC技术的开发者来说,确实是一份超值的学习材料。通过深入研究这些...
标题中的“nfc源码编译文件”指的是与近场通信(Near Field Communication, NFC)相关的源代码经过编译后的程序或库文件。...这个压缩包对那些想要开发、测试或研究NFC功能的个人或组织来说非常有用。
这个名为"安卓NFC相关-一个功能强大的nfc开发代码适用于解决手机平板打卡签到等功能.rar"的压缩包文件显然包含了一套针对NFC功能开发的代码库,旨在帮助开发者实现手机和平板的打卡签到等应用。尽管描述中提到无法...
标签中的关键词进一步确认了这个项目的焦点:NFC668设备、Python编程以及与之相关的库和工具。这些标签有助于理解项目的核心技术点,即使用Python来操作NFC668读写器进行数据交互。 压缩包中的“nfcpy-master”可能...
- 使用Logcat监控NFC相关的日志,帮助调试问题。 通过深入研究"AndroidBeamDemo"这个项目,开发者可以掌握如何在自己的应用中集成NFC点对点传输功能,提升应用的互动性和实用性。此外,理解这些知识点对于开发基于...
在这个名为“安卓NFC相关-NFC开发学习可以参考此代码demo中实现了简单易懂的NFC读与写能实现对IC卡的写入数据读取等操作.rar”的压缩包中,包含了Android平台上NFC功能开发的示例代码,旨在帮助开发者理解和应用NFC...
以下是对NFC相关知识点的详细说明: 1. **NFC技术原理**:NFC基于射频识别(RFID)技术,工作频率通常为13.56MHz。它由两部分组成:读写器(Reader/Writer Mode)和卡片模拟(Card Emulation Mode)。在读写模式下...
在这个“NFC资料代码.rar”压缩包中,我们可能找到了与NFC相关的源代码、文档或者示例,这些内容可能与银行卡应用以及ACR122U-A9 NFC读卡器的使用密切相关。 首先,我们要理解NFC在银行卡中的应用。现代的智能银行...
1.2 Android中的NFC API:Android提供了`android.nfc`包,包含了`NfcAdapter`、`Ndef`、`NdefFormatable`等类,用于处理NFC相关的任务,如开启/关闭NFC功能,读取/写入NDEF(NFC Data Exchange Format)消息,以及...
NFC TS27认证SPEC是与NFC相关的技术规范文档,它为开发者提供了标准的参考,以确保他们的NFC应用或功能满足特定的技术要求和标准。这份文件是GSMA(全球移动通信系统协会)所发布的,GSMA是一个全球性的行业协会,...
这个压缩包包含了用于Windows系统的NFC实用程序和源代码,为程序员提供了深入理解NFC在Windows环境下的工作原理以及开发相关应用的宝贵材料。 NFC技术的核心在于它的两个主要操作模式:读写模式和点对点模式。读写...
标题中的“matlab开发-NFC”表明我们正在讨论使用MATLAB进行...用户可以借此深入理解NFC的工作原理,进行相关研究或开发工作。为了充分利用这些资源,用户需要有一定的MATLAB基础和无线通信知识,同时遵守许可证条款。