使用NDEF Android应用程序记录(AAR)获取NFC标签

时间:2014-08-26 11:11:01

标签: android nfc intentfilter ndef android-applicationrecord

我正在开发NFC应用程序。要启动我的应用程序,我正在使用带有AAR NDEF记录的NDEF标记。

这很好用。但现在我想直接用app阅读标签内容。我怎么能这样做?

(已经有效,当我从手机上取下标签并再次触摸它时,我想取消这一步。)

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="nfctagscanner.mobileapps.lt.nfctagscanner" >
    <uses-feature android:name="android.hardware.nfc" android:required="true"/>
    <uses-permission android:name="android.permission.NFC" />

    <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>


        </activity>
        <activity
            android:name=".NFCScanActivity"
            android:label="@string/app_name" >
            <intent-filter>

                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="nfctagscanner.mobileapps.lt.nfctagscanner" android:host="ext"
                    android:pathPrefix="/android.com:pkg" />
            </intent-filter>
        </activity>
    </application>

</manifest>

我只想获得NDEF_DISCOVERED意图。但我总是得到action.MAIN / category.LAUNCHER意图与我的调试器。

任何帮助将不胜感激。我基于此做了我的工作:Android / NFC: Get Tag in onCreate() without new Intent

2 个答案:

答案 0 :(得分:15)

如果您希望应用程序由您的代码启动并希望接收已解析的NDEF消息,则您的代码应包含以下内容:

  1. 您要在上过滤NDEF记录作为NDEF消息的第一条记录(您只能为NFC标记上的第一个NDEF记录创建intent-filters)。给定your own answer,这将是一个文本记录(或MIME类型为text / plain的MIME类型记录)。但是,您可能需要考虑将NFC论坛外部类型记录与您的自定义应用程序特定类型名称一起使用(请参阅here,因为这样可以让您的应用程序更好地将标记与其他应用程序使用的标记区分开来。仅当记录包含人类可读的非解释 文本时,才应使用该记录。
  2. 如果您想确保您的应用已使用标记启动,那么如果用户执行此操作,则会自动打开您应用的Play商店页面没有安装应用程序,那么您还应该使用Android应用程序记录(AAR)。此记录应为NDEF消息中的最后记录。 (请注意,无论NDEF消息中的位置如何,都将遵循AAR,但将其用作第一条记录将导致post you linked in your question中描述的问题。)
  3. 一旦你的标签包含正确的NDEF消息,你必须为应该接收标签发现事件的活动和触发它的NDEF消息创建一个适当的意图过滤器:

    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
    

    或者,如果您使用自定义NFC论坛外部类型:

    <intent-filter>
        <action android:name="android.nfc.action.NDEF_DISCOVERED" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="vnd.android.nfc"
              android:host="ext"
              android:pathPrefix="/yourdomain.com:yourtypename"/>
    </intent-filter>
    

    如果您的应用 {/ 1}}意图过滤器与NDEF消息的第一个记录相匹配在您的代码上 您的代码包含一个Android应用记录,这是您的清单中声明的​​第一个活动,它具有NDEF_DISCOVERED的意图过滤器,并且android.intent.action.MAIN将开始。因此,该活动并未声明期望NFC意图它将通过android.intent.category.LAUNCHER 包含NDEF消息/标记句柄)

答案 1 :(得分:1)

我不知道这是否是正确答案,但我找到了解决办法:

        <activity
            android:name=".NFCScanActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>
    </application>

</manifest>