扫描NFC标签时是否可以启动应用程序?

Jam*_*ame 5 tags android nfc intentfilter android-intent

我有一个NFC标签.我想写一个自动启动的Android应用程序,当用手机扫描NFC标签时从NFC获取数据.

假设设备已打开NFC并且手机上没有其他应用程序运行,则应该可以正常工作.我找到了一些可以启动另一个应用程序的应用程序,但是我的应用程序应该在没有在后台运行的其他应用程序的情

有什么方法可以解决这个问题吗?

Mic*_*and 11

为了在扫描标记时启动您的应用(实际活动),您需要为应用清单添加适当的意图过滤器.

如果您只想为任何标记启动应用程序,TECH_DISCOVERED那么您可以使用intent过滤器:

<activity ...>
    <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>
Run Code Online (Sandbox Code Playgroud)

此intent过滤器需要一个额外的XML资源文件,该文件定义应用程序应该监听的标记技术(请注意intent-filter 外部<meta-data ... />标记).可用的技术是命名空间中的技术,目前: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

要发现任何标记,您将创建一个这样的XML文件(将文件创建为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>
    <tech-list>
        <tech>android.nfc.tech.NfcBarcode</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcF</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcV</tech>
    </tech-list>
</resources>
Run Code Online (Sandbox Code Playgroud)

请注意,您不一定需要将其他技术包括在内

  • IsoDep意味着NfcA或者NfcB,
  • MifareClassic暗示NfcA,
  • MifareUltralight暗示NfcA,和
  • Ndef/ NdefFormatable暗指NfcA,NfcB,NfcF,或NfcV.

如果没有其他应用程序具有更好的匹配意图过滤器,则将触发上述意图过滤器.更好的匹配将匹配标记上使用的数据类型.因此,例如,如果您的标记包含URL(封装在NDEF消息中),则在URL上触发的应用将优先于您的应用.如果您知道标记上使用的数据类型,则还可以为这些数据类型添加过滤器.例如,要匹配任何"http://"和"https://"URL,您可以使用:

<activity ...>
    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="http" />
        <data android:scheme="https" />
    </intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)

同样,如果您的标记包含MIME类型"application/vnd.com.example",则可以使用:

<activity ...>
    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="application/vnd.com.example" />
    </intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)

您甚至可以为一个活动组合多个intent过滤器:

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

    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="http" />
        <data android:scheme="https" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="application/vnd.com.example" />
    </intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)

最后,还有一个与NFC相关的意图过滤器:

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

但是,您通常不会在清单中使用此intent过滤器.它仅作为后备,只有在技术或扫描标签的数据没有其他应用程序触发时才会被触发.所以没有必要添加这个已经触发上述TECH_DISCOVEREDintent过滤器的intent - filter.