发现NFC_TECH时打开Android活动

时间:2015-04-22 09:58:51

标签: android android-intent nfc intentfilter mifare

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

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

我可以让设备通过调用

前景模式扫描标签
enableForegroundDispatch()

并返回包含所需数据EXTRA_ID

的新意图

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

我的应用程序清单上有以下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感兴趣

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

2 个答案:

答案 0 :(得分:3)

正如您似乎已经发现自己,可以使用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 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>

答案 1 :(得分:1)

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