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.IsoDepandroid.nfc.tech.MifareClassicandroid.nfc.tech.MifareUltralightandroid.nfc.tech.Ndefandroid.nfc.tech.NdefFormatableandroid.nfc.tech.NfcAandroid.nfc.tech.NfcBandroid.nfc.tech.NfcBarcodeandroid.nfc.tech.NfcFandroid.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.
| 归档时间: |
|
| 查看次数: |
5804 次 |
| 最近记录: |