高级 NFC 概览

将 NFC 标签与 Android 设备结合使用时,用于读取和写入标签数据的主要格式是 NDEF。当设备扫描具有 NDEF 数据的标签时,Android 会尽可能在解析消息和通过 <a href="https://developer.android.google.cn/reference/android/nfc/NdefMessage?hl=zh-cn" rel="noopener">NdefMessage</a> 传递该消息方面提供支持。不过,在某些情况下,您扫描的标签可能不包含 NDEF 数据,或者 NDEF 数据无法映射为 MIME 类型或 URI。在这些情况下,您需要直接开启与标签的通信,并使用自己的协议(以原始字节形式)对标签执行读写操作。Android 通过 <a href="https://developer.android.google.cn/reference/android/nfc/tech/package-summary?hl=zh-cn" rel="noopener">android.nfc.tech</a> 软件包对这些用例提供一般性支持,如表 1 所述。您可以使用 <a href="https://developer.android.google.cn/reference/android/nfc/Tag?hl=zh-cn#getTechList()" rel="noopener">getTechList()</a> 方法确定标签支持的技术,还可以使用 <a href="https://developer.android.google.cn/reference/android/nfc/tech/package-summary?hl=zh-cn" rel="noopener">android.nfc.tech</a> 提供的一个类来创建相应的 <a href="https://developer.android.google.cn/reference/android/nfc/tech/TagTechnology?hl=zh-cn" rel="noopener">TagTechnology</a> 对象。

表 1. 支持的标签技术

类说明 <a href="https://developer.android.google.cn/reference/android/nfc/tech/TagTechnology?hl=zh-cn" rel="noopener">TagTechnology</a>

这是所有标签技术类都必须实现的接口。 <a href="https://developer.android.google.cn/reference/android/nfc/tech/NfcA?hl=zh-cn" rel="noopener">NfcA</a>

提供对 NFC-A (ISO 14443-3A) 属性和 I/O 操作的访问权限。 <a href="https://developer.android.google.cn/reference/android/nfc/tech/NfcB?hl=zh-cn" rel="noopener">NfcB</a>

提供对 NFC-B (ISO 14443-3B) 属性和 I/O 操作的访问权限。 <a href="https://developer.android.google.cn/reference/android/nfc/tech/NfcF?hl=zh-cn" rel="noopener">NfcF</a>

提供对 NFC-F (JIS 6319-4) 属性和 I/O 操作的访问权限。 <a href="https://developer.android.google.cn/reference/android/nfc/tech/NfcV?hl=zh-cn" rel="noopener">NfcV</a>

提供对 NFC-V (ISO 15693) 属性和 I/O 操作的访问权限。 <a href="https://developer.android.google.cn/reference/android/nfc/tech/IsoDep?hl=zh-cn" rel="noopener">IsoDep</a>

提供对 ISO-DEP (ISO 14443-4) 属性和 I/O 操作的访问权限。 <a href="https://developer.android.google.cn/reference/android/nfc/tech/Ndef?hl=zh-cn" rel="noopener">Ndef</a>

提供对 NDEF 格式的 NFC 标签上的 NDEF 数据和操作的访问权限。 <a href="https://developer.android.google.cn/reference/android/nfc/tech/NdefFormatable?hl=zh-cn" rel="noopener">NdefFormatable</a>

为可设置为 NDEF 格式的标签提供格式化操作。

Android 设备还可以选择支持以下标签技术。

表 2. 可选择支持的标签技术

当设备扫描包含 NDEF 数据但无法映射为 MIME 或 URI 的标签时,标签调度系统会尝试使用 <a href="https://developer.android.google.cn/reference/android/nfc/NfcAdapter?hl=zh-cn#ACTION_TECH_DISCOVERED" rel="noopener">ACTION_TECH_DISCOVERED</a> Intent 来启动 Activity。在扫描到包含非 NDEF 数据的标签时,也会使用 <a href="https://developer.android.google.cn/reference/android/nfc/NfcAdapter?hl=zh-cn#ACTION_TECH_DISCOVERED" rel="noopener">ACTION_TECH_DISCOVERED</a>。如果标签调度系统无法解析标签数据,此回退功能可让您直接处理标签数据。使用标签技术的基本步骤如下:

对 NFC 标签执行读写操作涉及从 Intent 获取标签以及开启与标签的通信。您必须定义自己的协议栈才能读写标签数据。不过,请注意,在直接处理标签时,您仍然可以读写 NDEF 数据,具体取决于您要如何设计其结构。下面的示例展示了如何使用 MIFARE Ultralight 标签。

使用前台调度系统

借助前台调度系统,Activity 可以拦截 Intent 并声明自己可优先于其他 Activity 处理同一 Intent。使用此系统涉及为 Android 系统构造一些数据结构,以便将合适的 Intent 发送到您的应用。要启用前台调度系统,请执行以下操作:

*

val intent = Intent(this, javaClass).apply {        addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)    }    var pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent, 0)
  • 声明 Intent 过滤器,以处理您要拦截的 Intent。前台调度系统会对照设备扫描标签时所获得的 Intent 来检查所指定的 Intent 过滤器。如果匹配,那么应用会处理该 Intent。如果不匹配,那么前台调度系统会回退到 Intent 调度系统。指定 Intent 过滤器和技术过滤器的 null 数组,以指明要过滤所有回退到 TAG_DISCOVERED Intent 的标签。以下代码段会处理 NDEF_DISCOVERED 的所有 MIME 类型。您应只处理需要的内容。Kotlin Java
    *
val ndef = IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply {        try {            addDataType("*/*")    /* Handles all MIME based dispatches.                                     You should specify only the ones that you need. */        } catch (e: IntentFilter.MalformedMimeTypeException) {            throw RuntimeException("fail", e)        }    }    intentFiltersArray = arrayOf(ndef)
  • 设置应用要处理的一组标签技术。调用 Object.class.getName() 方法以获取要支持的技术的类。Kotlin Java
    *
    1.
techListsArray = arrayOf(arrayOf<String>(NfcF::class.java.name))
  • 替换以下 Activity 生命周期回调,并添加相应逻辑,以分别在 Activity 失去 (<a href="https://developer.android.google.cn/reference/android/app/Activity?hl=zh-cn#onPause()" rel="noopener">onPause()</a>) 焦点和重新获得 (<a href="https://developer.android.google.cn/reference/android/app/Activity?hl=zh-cn#onResume()" rel="noopener">onResume()</a>) 焦点时启用和停用前台调度。 <a href="https://developer.android.google.cn/reference/android/nfc/NfcAdapter?hl=zh-cn#enableForegroundDispatch(android.app.Activity,%20android.app.PendingIntent,%20android.content.IntentFilter%5B%5D,%20java.lang.String%5B%5D%5B%5D)" rel="noopener">enableForegroundDispatch()</a> 必须从主线程调用,并且只能在 Activity 在前台运行时调用(在 <a href="https://developer.android.google.cn/reference/android/app/Activity?hl=zh-cn#onResume()" rel="noopener">onResume()</a> 中调用可确保这一点)。您还需要实现 <a href="https://developer.android.google.cn/reference/android/app/Activity?hl=zh-cn#onNewIntent(android.content.Intent)" rel="noopener">onNewIntent</a> 回调以处理扫描到的 NFC 标签中的数据。

Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.

Last updated 2019-12-27 UTC.

Original: https://www.cnblogs.com/jiftle/p/16508340.html
Author: jiftle
Title: 高级 NFC 概览

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/552195/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球