适用于所有类型的Android NFC Intent过滤器

Mat*_*abo 1 android nfc intentfilter android-intent ndef

我想创建一个Android应用程序,处理针对所有类别和所有数据类型发现的所有NFC事件,例如NDEF,TECH和TAG。

这些意图过滤器位于我的Android Manifest文件中:

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <action android:name="android.nfc.action.TECH_DISCOVERED" />
    <action android:name="android.nfc.action.TAG_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)

当事件为TAG_DISCOVERED时,此代码有效。NDEF_DISCOVERED不要调用我的应用程序。

谁能发现我在做什么错?

Mic*_*and 5

您的意图过滤器

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <action android:name="android.nfc.action.TECH_DISCOVERED" />
    <action android:name="android.nfc.action.TAG_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)

由于NFC的意图分派是如何工作的,这没有什么意义(请参阅NFC标签如何分派给应用程序

  1. TAG_DISCOVERED(在清单中使用时)只有在针对匹配标记的TECH_DISCOVEREDNDEF_DISCOVERED意图注册任何应用的情况下才会触发。因此,如果您还打算注册您的应用程序以处理所有事务TECH_DISCOVEREDNDEF_DISCOVERED意图,通常无需同时注册TAG_DISCOVERED

  2. NDEF_DISCOVERED意图过滤器需要(在许多平台的版本/设备,可选一些),你要听的(见额外的数据类型<data ... />)。没有万能的NDEF_DISCOVERED意图过滤器(尽管您可以通过使用TECH_DISCOVEREDNdef和NdefFormatable技术来接近它)。NDEF_DISCOVERED仅匹配最具体的意图过滤器。例如,如果您注册以“ http://”开头的所有URL,则任何注册以“ http://www.example.com/ ” 开头的URL 的应用程序都将优先于您的应用程序。因此,您需要注册无数种数据类型才能获得高于所有其他应用程序的优先级。

  3. TECH_DISCOVERED意图过滤要求,你要听的(见标签技术的补充定义LaurentY答案)。可用的技术是名称空间中的技术android.nfc.tech.*,当前:

    android.nfc.tech.IsoDep
    android.nfc.tech.MifareClassic
    android.nfc.tech.MifareUltralight
    android.nfc.tech.Ndef
    android.nfc.tech.NdefFormatable
    android.nfc.tech.NfcA
    android.nfc.tech.NfcB
    android.nfc.tech.NfcBarcode
    android.nfc.tech.NfcF
    android.nfc.tech.NfcV
    
    Run Code Online (Sandbox Code Playgroud)

    您可以在XML文件中指定它们。例如,要匹配所有NfcA和所有NfcB标签,可以在名为的文件中使用此标签xml/nfc_tech_filter.xml

    <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
        <tech-list>
            <tech>android.nfc.tech.NfcA</tech>
        </tech-list>
        <tech-list>
            <tech>android.nfc.tech.NfcB</tech>
        </tech-list>
    </resources>
    
    Run Code Online (Sandbox Code Playgroud)

    然后,您可以使用<meta-data>标签(在<activity>标签内但在标签外)附加此XML文件<intent-filter>

    <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
               android:resource="@xml/nfc_tech_filter" />
    
    Run Code Online (Sandbox Code Playgroud)