在附加的任何(空)NFC上启动应用程序

时间:2016-05-01 13:55:36

标签: android tags nfc intentfilter

我已经尝试过100种不同的方法来完成它。我无法弄清楚如何做到这一点。

我有一个空的NFC标签。我只需要启动应用程序,如果我的手机扫描NFC标签,无论它是什么标签,或者写在它上面的是什么。我不想在上面写点东西,或者读它。

目前,如果我扫描NFC标签,我的手机会打开Android内置NFC读卡器。

如果我的应用程序已打开,则会检测到扫描NFC标签。但我想通过扫描标签来启动应用程序。

这是我的清单:

<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />

<activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <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>

    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
        <action android:name="android.nfc.action.TAG_DISCOVERED"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>

请注意,我尝试了不同的方法来启动应用程序...它没有一次工作。

如果您需要我的MainActivity,请告诉我。请注意,我的MainActivity不会在启动时启动。我之前有一个闪屏活动。

甚至可能吗?并且,是否可以通过服务或其类型启动应用程序?

2 个答案:

答案 0 :(得分:1)

您可以使用TECH_DISCOVERED intent过滤器捕获任何(空或非空)标记的事件:

<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>...</activity>标记附上目标过滤器。 <meta-data>标记必须位于intent-filter标记之外,但也必须包含活动标记。

此外,您需要一个技术过滤器文件(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.NfcF</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcV</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcBarcode</tech>
    </tech-list>
</resources>

由于NdefIsoDep等其他技术在上述基本标记技术(NfcANfcB等)之上运行,因此无需指定它们在过滤器文件中,因为它们已经被基本标记技术所覆盖。

请注意,如果您在一个<tech>条目中列出多个<tech-list>条目,则它们将与逻辑AND组合,而多个<tech-list>条目与逻辑OR组合。

上面将使用您在过滤器文件中列出的任何技术过滤空标签和非空标签。但是,对于非空NDEF格式的标记,与标记上的数据类型匹配的任何NDEF_DISCOVERED意图过滤器(来自您的应用或任何其他应用)将优先于TECH_DISCOVERED意图过滤器。因此,在这些情况下,您的应用无法收到通知。如果您还想接收此类标记的事件,则需要使用适当的数据类型注册NDEF_DISCOVERED intent过滤器。例如。如果数据类型是网址http://www.example.com/

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:scheme="http"
          android:host="www.example.com" />
</intent-filter>

最后,尽量避免使用TAG_DISCOVERED intent过滤器。这意味着作为后备,只有在没有为该标记类型注册其他应用程序时才会触发。

答案 1 :(得分:0)

我创建了一个简单的应用程序,我只将清单文件更改为:

 <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <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.TAG_DISCOVERED"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>

    </activity>
</application>