【问题标题】:Open Android Activity when NFC_TECH is discovered发现 NFC_TECH 时打开 Android Activity
【发布时间】:2015-06-29 21:38:35
【问题描述】:

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

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

我可以通过调用

让设备在foreground模式下扫描标签
enableForegroundDispatch()

它以包含所需数据EXTRA_ID的新意图返回我

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

我的应用程序清单上有以下意图过滤器

        <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 感兴趣

是否可以在标签扫描时打开/通知我的活动而不在标签上写任何内容?

【问题讨论】:

    标签: android android-intent nfc intentfilter mifare


    【解决方案1】:

    您似乎已经发现自己,这可以使用 TECH_DISCOVERED 意图过滤器:

    <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 and NfcA and NfcB and and NfcF and 等。由于其中一些标签技术(例如 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>
    

    【讨论】:

    • 谢谢!我不知道技术列表是这样工作的!这对我帮助很大!
    【解决方案2】:

    在 NDEF_DISCOVERED 上打开您的 android 应用。

    您必须设置您的自定义 mimeType。通过这样做,您让 android 知道这是您的自定义标签,并且此应用程序非常适合该标签。

    注意:您不能期望您的应用会针对您显示的所有标签类型/mime 类型打开。如您所知,这是用户选择他/她喜欢的应用程序的选择。

    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED" />
        <!-- THIS ONE -->
        <data android:mimeType="application/com.myExample.myVeryOwnMimeType" /> 
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    

    【讨论】:

    • 那么除了在标签上写自己的 mimetype 绝对没有别的办法?
    • 是的,您没有任何其他可能的选择。
    • 这就是我所怀疑的。感谢您的确认!我会尽快接受您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    相关资源
    最近更新 更多