原文地址:http://blog.csdn.net/zoeice/article/details/9714963
本文档介绍了高级的NFC主题,如各种标签技术,NFC标签写入和前台发布,它允许即使当其他应用程序过滤器相同的时候,应用程序在前台处理Intent。
Tag技术支持工作
当使NFC Tag和Android的供电设备生效,使用Tag来读取和写入数据的主要格式是NDEF,当设备扫描NDEF数据的Tag,Android提供支持解析的消息,并在可能的情况下将它传入一个NdefMessage,但是,在有些情况下,当你扫描不包含NDEF数据的Tag或当NDEF数据时无法映射到MIME类型或URI时。在那样的情况下,你需要直接与Tag建立沟通及用自己的协议(在原始字节)读写它,Android用android.nfc.tech包对那些情况提供了通用的支持,如表1中所描述的。您可以使用getTechList()方法来确定技术支持Tag,并且用由android.nfc.tech提供的类的其中一个创建相应TagTechnology对象.
表 1.支持的Tag技术
类
描述
TagTechnology
|
这个接口是下面所有tag technology类必须实现的。
|
NfcA
|
提供访问 NFC-A (ISO 14443-3A) 的属性和 I/O 操作
|
NfcB
|
提供访问 NFC-B (ISO 14443-3B) 的属性和 I/O 操作
|
NfcF
|
提供访问 NFC-F (JIS 6319-4) 的属性和 I/O 操作
|
NfcV
|
提供访问 NFC-V (ISO 15693) 的属性和 I/O 操作
|
IsoDep
|
提供访问 ISO-DEP (ISO 14443-4) 的属性和 I/O 操作
|
Ndef
|
提供对那些被格式化为NDEF的tag的数据的访问和其他操作
|
NdefFormatable
|
对那些可以被格式化成NDEF格式的tag提供一个格式化的操作
|
下面的Tag技术不要求被Android的供电设备支持。
表 2.可选的支持的Tag技术
Tag技术工作和ACTION_TECH_DISCOVEREDIntent
当一个设备扫描一个有NDEF数据的Tag,但不能被映射到一个MIME或URI时,Tag发布系统试图启动一个Activity与ACTION_TECH_DISCOVEREDIntent。当非NDEF被扫描到时,ACTION_TECH_DISCOVERED的Tag也可以使用.如果Tag发布系统无法为你解析它,此回退让你直接进行扫描标签上的数据,基本步骤与标签技术如下:
- 过滤一个你想要处理的Tag技术的ACTION_TECH_DISCOVEREDintent.
获取更多信息请参阅过滤 NFC intents. 一般来说。 当一个NDEF消息不能被映射到MIME类型或者URI上时,Tag发布系统尝试启动一个ACTION_TECH_DISCOVEREDintent,
否则如果被扫描到的Tag不包含NDEF数据. 欲了解如何确定的更多信息,请参阅Tag发布系统.
-
当你的应用程序接收到该Intent, 从以图中获取Tag对象:
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
-
通过调用在android.nfc.tech包的类中的一个getfactory方法,获取到TagTechnology的一个实例
. 你可以在调用一个getfactory方法以前,计算支持Tag技术通过调用getTechList(). 举例来说, 为了从一个Tag得到MifareUltralight的一个实例,
请执行下列操作:
MifareUltralight.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG));
读取和写入Tags
读取和写入NFC tag涉及到从Intent中获取到Tag并创建与tag的连接. 你必须定义你自己的协议来读写数据到Tag. 然后,记住当直接使用Tag时你仍然能够读写NDEF数据. 你想要如何构建东西,它可以实现. 如下的例子演示如何使用一个MIFARE Ultralight tag.
package com.example.android.nfc;
import android.nfc.Tag;
import android.nfc.tech.MifareUltralight;
import android.util.Log;
import java.io.IOException;
import java.nio.charset.Charset;
public class MifareUltralightTagTester {
private static final String TAG = MifareUltralightTagTester.class.getSimpleName();
public void writeTag(Tag tag, String tagText) {
MifareUltralight ultralight = MifareUltralight.get(tag);
try {
ultralight.connect();
ultralight.writePage(4, "abcd".getBytes(Charset.forName("US-ASCII")));
ultralight.writePage(5, "efgh".getBytes(Charset.forName("US-ASCII")));
ultralight.writePage(6, "ijkl".getBytes(Charset.forName("US-ASCII")));
ultralight.writePage(7, "mnop".getBytes(Charset.forName("US-ASCII")));
} catch (IOException e) {
Log.e(TAG, "IOException while closing MifareUltralight...", e);
} finally {
try {
ultralight.close();
} catch (IOException e) {
Log.e(TAG, "IOException while closing MifareUltralight...", e);
}
}
}
public String readTag(Tag tag) {
MifareUltralight mifare = MifareUltralight.get(tag);
try {
mifare.connect();
byte[] payload = mifare.readPages(4);
return new String(payload, Charset.forName("US-ASCII"));
} catch (IOException e) {
Log.e(TAG, "IOException while writing MifareUltralight
message...", e);
} finally {
if (mifare != null) {
try {
mifare.close();
}
catch (IOException e) {
Log.e(TAG, "Error closing tag...", e);
}
}
}
return null;
}
}
使用前端发布系统
前端发布系统允许一个activity拦截一个 intent并且要求由于其他处理同样intent的activities. 使用这个系统涉及到为了Android系统能够发送合适的intents给你的应用程序而构建几个数据结构. 为了使前端发布系统有效:
-
在你的activity的
onCreate()
方法中添加如下代码:
-
创建一个
PendingIntent
对象,
以便系统可以在它被扫描到时,用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。下面的代码片断处理所有NDEF_DISCOVERED的MIME类型.
因此请注意你应该只处理你想要的Intent。
IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndef.addDataType("*/*"); /* Handles all MIME based dispatches.
You should specify only the ones that you need. */
}
catch (MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
}
intentFiltersArray = new IntentFilter[] {ndef, };
-
设置一个你程序要处理的Tag
technologies的列表,调用Object.class.getName()方法来获得你想要支持处理的technology类。
techListsArray = new String[][] { new String[] { NfcF.class.getName() } };
-
覆盖下面的方法来打开或关闭前台发布系统。比如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-MINI门禁卡读写软件,使用说明:1.驱动安装流程:右键我的电脑属性。注:如果有黄色的感叹号!请打补丁。2.请打开部分32位或64位的补丁,全部复制粘贴到以下两个路径:1:C:\Windows\INF2:C:\Windows\System32\...
此外,智能解码程序还可能具备一些高级特性,如动态配置、多语言支持、错误检测和恢复等。对于开发者而言,理解NFC Reader的智能解码程序意味着能够自定义其行为,以满足特定应用需求。例如,通过编程,我们可以使...
`nfc_driver.h`和`nfc_driver.cpp`则可能包含了NFC驱动程序的实现,驱动程序是操作系统和硬件设备之间的桥梁,它负责将高级操作系统的指令转换为硬件能理解的命令。在这个项目中,这些文件可能定义了与NXP NFC芯片...
例如,某些高级的NFC标签支持密码保护,只有输入正确密码后才能读取或写入数据。此外,NFC在移动支付、门禁、资产追踪等领域有广泛应用。例如,通过NFC手机支付可以快速完成交易;在博物馆中,游客可以用手机扫描...
3. **Python编程**:Python是一种高级编程语言,以其简洁的语法和丰富的库支持而闻名,是开发NFC应用的理想选择。 4. **nfcpy库**:这是一个Python库,提供与NFC设备交互的功能,包括读取、写入和管理NFC标签。它...
在"**NFC卡模拟器 NFC Card Emulator Pro v8.0.1高级版.zip**"这个压缩包中,我们主要探讨的是这款高级版的NFC模拟器应用。 首先,NFC卡模拟器的功能包括但不限于: 1. **模拟多种类型的NFC标签**: 它可以模拟ISO ...
对于更高级的设置,如加密和解密,用户需参考软件内的帮助文档或在线教程。 总结,NFC Reader Pro_KGF作为一款强大的NFC管理工具,不仅为个人用户提供了便利的信息交互方式,也为商业应用提供了更多可能。随着NFC和...
NFC技术基于射频识别(RFID)技术,但具有更高级的功能和更方便的使用方式。RFID主要用于非接触式卡片和读卡器之间的通信,如门禁系统和物流追踪,而NFC则扩展了这一概念,使其能够支持点对点通信、读/写模式和卡...
Corx可能是一个软件框架或库,用于简化STM32上的软件开发,它可能包含了与硬件交互的驱动程序和高级抽象层。在结合libNFC时,Corx库可能是为STM32平台定制的NFC接口,使得开发者可以更方便地利用libNFC的功能。 ...
这些文件的组合提供了一个完整的NFC功能集,涵盖了从基础通信到高级应用的多个方面。例如,开发人员可以通过libnfc.dll进行底层编程,利用winscard.dll处理智能卡,使用图形化工具NFCGUIFreeVer.exe进行测试和调试,...
6. **高级功能**:对于有经验的用户,NFC Tools PRO 提供了高级设置,如MIFARE Classic的扇区锁定和解密,以及使用NDEF格式(NFC Data Exchange Format)的自定义NDEF消息。 7. **兼容性**:确保与大多数支持NFC...
总的来说,NFC Delphi Peer to Peer编程结合了底层通信协议的理解、高级编程技巧以及对用户需求的敏锐把握,是构建创新应用的关键所在。通过不断学习和实践,开发者可以利用这一技术为用户提供便捷、安全的近距离...
这涉及到电磁场的计算,MATLAB的电磁仿真工具箱可能对此有所帮助,尽管这通常需要更高级的建模技巧。 5. **错误检测与纠正**: 为了保证数据传输的可靠性,NFC协议通常会包含错误检测和纠正机制,如CRC校验或奇偶...
这意味着它可以用于简单的名片交换、个性化交易、忠诚度计划,甚至可以实现设备之间的自动配置和委托操作等高级功能。此外,由于NFC与现有的智能卡基础设施兼容,因此它可以无缝集成到支付系统、门禁系统和公共交通...
《NFC_WAR(0.0.2):探索手机NFC标签读写技术》 在信息化日益发达的今天,NFC(Near Field Communication,近场通信)技术逐渐成为我们生活中的一部分,尤其在移动设备中得到了广泛应用。"NFC_WAR(0.0.2)" 是一款...
对于API 19(KitKat)之前的设备,可能需要使用旧版的`NfcAdapter`方法,而API 19及以后的设备则可以使用更高级的功能,如`HostApduService`等。 7. 安全与隐私: 虽然NFC技术提供了便利,但也需注意安全问题。在...
这个库通常包含了对不同NFC控制器的驱动支持,以及一些高级功能,如与NDEF(NFC Data Exchange Format)消息的交互。 在实际项目中,开发者可能需要将libnfc库与STM32的USB驱动集成,以实现通过USB接口控制NFC设备...
通过阅读文档,开发者可以了解如何使用这些库函数进行高级操作。 总的来说,NFC-tools配合ACR122U读卡器,为Windows用户提供了一个强大且灵活的平台,便于NFC技术的开发、测试和应用。无论是简单的数据交换还是复杂...
博通公司无线互连组合芯片事业部中国区总经理兼高级总监周晏逸表示,作为博通第六代组合芯片,BCM43341在小尺寸、低功耗和低成本方面,都具备领先优势。而BCM20793的NFC芯片单卡解决方案,将NFC和5G Wi-Fi功能结合,...
首先,NFC技术基于射频识别(RFID)技术,但具有更高级的功能和交互性。NFC设备可以在点对点(P2P)、读卡器模式和卡模拟模式下工作。在P2P模式下,两个NFC设备可以互传数据;在读卡器模式下,NFC设备可以读取或写入...