android应用NFC(3)---TECH_DISCOVERED的tech筛选规则

本文介绍在Android应用中如何使用TECH_DISCOVERED过滤模式来指定支持的NFC标准。通过设置AndroidManifest.xml中的intent过滤器及关联tech过滤器XML文件,实现对不同NFC标签的精确识别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

上一章讲到了在activityintent过滤器中,如果选用了TECH_DISCOVERED作为action的过滤模式,则必须要定义一个xml文件来筛选所能支持的NFC标准,步骤如下:

1、在AndroidManifest.xml中设置activity的intent过滤器

过滤器根据

<meta-data android:name="android.nfc.action.TECH_DISCOVERED"

          android:resource="@xml/filter_nfc" />

 来关联对应的tech过滤器filter_nfc文件,比如此处,对应的tech过滤器文件为filter_nfc,此文件是在xml文件夹下

2、filter_nfc中的过滤规则,假设一个tag使用的是14443-3A标准,而且在<tech-list>….</tech-list>标签之间刚好有<tech>android.nfc.tech.NfcA</tech>标签,则改tag方才满足android.nfc.action.TECH_DISCOVERED的过滤规则,当然,在次之前必须先前台发布规则和intent系统发布规则。

3、同一个<tech-list>….</tech-list>之间的<tech>是“并且”的关系,也即假设按照下图设置了所有的tech,则被扫描的tag必须同时具备所有的NFC标准,此tag才是可被识别的。

举例说明,深圳城市通卡同时满足以下三种tech:

<tech>android.nfc.tech.IsoDep</tech>

<tech>android.nfc.tech.MifareClassic</tech>

<tech>android.nfc.tech.NfcA</tech>

所以当<tech-list>….</tech-list>之中包含且仅包含三种tech中的一种或几种时,该深圳城市通卡是可以满足android.nfc.action.TECH_DISCOVERED的过滤规则,但是当增加之外的tech时,比如<tech>android.nfc.tech.MifareUltralight</tech>,则深圳城市通卡无法满足TECH_DISCOVERED规则。

4、<tech-list>….</tech-list>与<tech-list>….</tech-list>之间是“或者”的关系,tag只要满足其中任何一种tech,则可以满足android.nfc.action.TECH_DISCOVERED的过滤规则。通过这个特性可以测试出一张IC卡究竟满足哪种NFC规范,把每种tech写在一个<tech-list>….</tech-list>之间,进行一一的判别,如下图:

 例子下址地址:http://download.youkuaiyun.com/detail/niejing654092427/4398354

将本例安装在手机上.

情况1:把深圳通靠近NFC手机,如果手机上的应用只有这个支持,就会打开该应用.效果如下:

情况2:把深圳通靠近NFC手机,如果手机上的多个应用支持,就会出现一个选择,效果如下:

 说明:

当手机开启了NFC,并且检测到一个TAG后,TAG分发系统会自动创建一个封装了NFC TAG信息的intent。如果多于一个应用程序能够处理这个intent的话,那么手机就会弹出一个框(如上图),让用户选择处理该TAG的Activity。

TAG分发系统定义了3中intent。按优先级从高到低排列为:NDEF_DISCOVERED, TECH_DISCOVERED, TAG_DISCOVERED
当Android设备检测到有NFC Tag靠近时,会根据Action申明的顺序给对应的Activity 发送含NFC消息的 Intent。
此处我们使用的intent-filter的Action类型为TECH_DISCOVERED从而可以处理所有类型为ACTION_TECH_DISCOVERED并且使用的技术为nfc_tech_filter.xml文件中定义的类型的TAG。

<think>我们正在处理Android NFCTECH_DISCOVERED action,用于读写NFC标签。 根据引用[1]和[2],我们需要在AndroidManifest.xml中为Activity配置intent-filter和meta-data,其中meta-data指定了技术列表(tech_list)。 在代码中,我们需要处理TECH_DISCOVERED的intent,然后根据标签支持的技术进行读写操作。 步骤: 1. 在AndroidManifest.xml中为Activity声明intent-filter和meta-data。 2. 在res/xml目录下创建tech_list.xml文件,定义支持的技术。 3. 在Activity中处理intent,获取Tag对象。 4. 根据Tag对象选择合适的技术(如NfcA, Ndef等)进行读写。 注意:引用[3]提到,TECH_DISCOVERED是三种数据过滤器之一,用于处理已知技术但未知NDEF类型的情况。 下面是一个示例代码框架:</think>### Android NFC ACTION_TECH_DISCOVERED 数据处理指南 在 Android 应用中处理 `ACTION_TECH_DISCOVERED` NFC 标签时,需遵循以下步骤: #### 1. 清单文件配置 在 `AndroidManifest.xml` 中声明 `TECH_DISCOVERED` 过滤器和技术列表: ```xml <activity android:name=".NfcActivity"> <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 标签[^2]。 #### 2. 定义技术过滤器 在 `res/xml/nfc_tech_filter.xml` 中指定支持的 NFC 技术: ```xml <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <!-- 示例:支持 NDEF 格式的 NFC-A 标签 --> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.Ndef</tech> </tech-list> </resources> ``` 可根据需求组合技术如 `NfcB`, `MifareClassic` 等[^1]。 #### 3. 核心处理逻辑 在 Activity 中实现标签处理: ```java public class NfcActivity extends Activity { @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) { Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); processTag(tag); // 处理标签数据 } } private void processTag(Tag tag) { // 示例:读取 NDEF 数据 Ndef ndef = Ndef.get(tag); if (ndef != null) { try { ndef.connect(); NdefMessage ndefMessage = ndef.getNdefMessage(); if (ndefMessage != null) { String data = new String(ndefMessage.getRecords()[0].getPayload()); Log.d("NFC", "读取数据: " + data); } } catch (IOException | FormatException e) { Log.e("NFC", "读取失败", e); } finally { try { ndef.close(); } catch (IOException e) { /* 忽略 */ } } } } } ``` #### 4. 数据写入示例 ```java private void writeTag(Tag tag, String text) { NdefRecord record = NdefRecord.createTextRecord("en", text); NdefMessage message = new NdefMessage(new NdefRecord[]{record}); Ndef ndef = Ndef.get(tag); try { ndef.connect(); if (ndef.isWritable()) { ndef.writeNdefMessage(message); Toast.makeText(this, "写入成功", Toast.LENGTH_SHORT).show(); } } catch (IOException | FormatException e) { Log.e("NFC", "写入失败", e); } finally { try { ndef.close(); } catch (IOException e) { /* 忽略 */ } } } ``` #### 关键注意事项 1. **技术兼容性**:`TECH_DISCOVERED` 用于处理已知技术栈但未知 NDEF 类型的标签[^3] 2. **权限声明**:需在清单中添加 NFC 权限: ```xml <uses-permission android:name="android.permission.NFC" /> ``` 3. **超时处理**:所有 NFC 操作应在 300ms 内完成,避免 ANR 4. **前台调度**:使用 `NfcAdapter.enableForegroundDispatch()` 提升标签捕获优先级 常见应用场景包括门禁系统、产品信息读取、数据交换等[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值