android - 发现 NFC_TECH 时打开 Android Activity

标签 android android-intent nfc intentfilter mifare

我正在开发一个应用程序,需要在扫描 NFC 标签时打开该应用程序,该标签不包含除 ID 之外的任何数据(?)。

数据库中的项目应该由该 ID 标识,并且我不应该在这些标签上写任何内容

我可以通过调用让设备在前台模式下扫描标签

enableForegroundDispatch()

它会向我返回包含所需数据的新 Intent EXTRA_ID

但是,当应用程序在后台运行并且我扫描标签时,我可以听到扫描完成的系统声音,但应用程序未打开

我的应用程序 list 上有以下 Intent 过滤器

        <intent-filter>
            <action android:name="android.nfc.action.TAG_DISCOVERED"/>
        </intent-filter>

        <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" />

nfc_tech_filter.xml包含Android支持的所有标签

<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>

我正在扫描的标签类型为 android.nfc.tech.MifareUltralight、android.nfc.tech.NfcA、android.nfc.tech.NdefFormatable

我只对标签 ID 感兴趣

是否可以在标签扫描时打开/通知我的 Activity ,而无需在标签上写入任何内容?

最佳答案

正如您自己似乎已经发现的那样,可以使用 TECH_DISCOVERED Intent 过滤器:

<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" />

问题出在您的技术过滤器 XML 文件上。您指定的技术过滤器将转换为*匹配 IsoDep NfcA NfcB NfcF 等任何标签。由于其中一些标签技术(例如 Nfc[A|B|F|V])是互斥的,因此任何标签都不会匹配此条件。

您可以通过指定一个技术过滤器来克服这个问题,该技术过滤器将所有这些技术与逻辑相匹配:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcB</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcF</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcV</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NdefFormatable</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.MifareClassic</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcBarcode</tech>
    </tech-list>
</resources>

或者,由于您已经发现您的标签是 NfcA,您也可以简单地匹配 NfcA:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
    </tech-list>
</resources>

关于android - 发现 NFC_TECH 时打开 Android Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41615851/

相关文章:

java - 数据库的 SQLiteConnection 对象被泄露!请修复您的应用程序

android - NFC 标签必须是 NDEF 格式吗?

android - Android 设备之间的 NFC 交互触发 Android Beam 而不是 HCE

c# - 是否可以忽略邻近设备消息

android - RecyclerView 项目中的 YouTubePlayerView

android - 为什么我收到表名称的列不存在错误

安卓方向

ANDROID - Intent 将应用程序作为文件管理器启动

android - 登录页面重定向的 Intent 标志,杀死以前的 Activity

java - 无法实例化 Activity ComponentInfo 错误(已检查 list )