我有一个NFC标签。我想写一个自动启动的Android应用程序,当用手机扫描NFC标签时从NFC获取数据。
假设设备已打开NFC并且手机上没有其他应用程序运行,则应该可以正常工作。我找到了一些可以启动另一个应用程序的应用程序,但我的应用程序应该可以在没有后台运行的其他应用程序的情况下运行。
有没有办法解决这个问题?
答案 0 :(得分:10)
为了在扫描标记时启动您的应用(实际上活动),您需要为应用清单添加适当的意图过滤器。
如果您想为任何代码启动应用,TECH_DISCOVERED
意图过滤器就是您想要使用的内容:
<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>
此意向过滤器需要一个额外的XML资源文件,用于定义应用应该监听的标记技术(请注意<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>
请注意,您不一定需要使用其他技术
IsoDep
表示NfcA
或NfcB
,MifareClassic
隐含NfcA
,MifareUltralight
隐含NfcA
和Ndef
/ NdefFormatable
暗示NfcA
,NfcB
,NfcF
或NfcV
。如果没有其他应用具有更好的匹配意图过滤器,则会触发上述意图过滤器。更好的匹配将匹配标记上使用的数据类型。因此,例如,如果您的标记包含URL(封装在NDEF消息中),则在URL上触发的应用将优先于您的应用。如果您知道标记上使用的数据类型,则还可以为这些数据类型添加过滤器。例如,要匹配任何&#34; http://&#34;和&#34; https://&#34; 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>
同样,如果您的代码包含MIME类型&#34; application / vnd.com.example&#34;,您可以使用:
<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>
您甚至可以为一项活动组合多个意图过滤器:
<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>
最后,还有一个与NFC相关的意图过滤器:
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
但是,您通常不在清单中使用此intent过滤器。它仅作为后备,只有在技术或扫描标签的数据没有其他应用程序触发时才会被触发。因此,您无需为上面提到的TECH_DISCOVERED
意图过滤器添加此触发器的意图过滤器。
答案 1 :(得分:1)
将以下intent-filter
添加到activity
文件中的主AndroidManifest.xml
标记。
<!-- main activity -->
<activity ...>
...
<intent-filter>
<action android-name="android.nfc.action.TAG_DISCOVERED" />
<category android-name="android.nfc.category.DEFAULT" />
</intent-filter>
...
</activity>
现在,当您将NFC标签点按到手机上时,您的应用程序将被调用并运行。