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

8
我正在开发一款NFC应用。为了启动我的应用程序,我使用了一个内置AAR NDEF记录的NDEF标签。
这很好用。但是现在我想直接使用应用程序读取标签内容。我该如何做?
(当我从手机中取出标签并再次触摸它时,它已经可以工作了,但我想消除这个步骤。)
清单:
<?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个回答

21
如果你想通过标签启动你的应用并接收解析后的NDEF消息,你的标签应该包含以下内容:
  1. 一个NDEF记录作为你要过滤的第一条记录(你只能为NFC标签上的第一条NDEF记录创建意图过滤器)。根据你自己的回答,在你的情况下,这将是一个文本记录(或具有MIME类型text/plain的MIME类型记录)。然而,你可能希望考虑使用一个NFC论坛外部类型记录,其中包含你的自定义应用程序特定类型名称(见此处),这将允许你的应用更好地区分其他应用所使用的标签。文字记录应该仅在它包含可读的非解释的文本时才使用。
  2. 如果你想确保只有你的应用程序启动标签并且如果用户没有安装应用程序,则自动打开你的应用程式的Play Store页面,则还应使用Android Application Record(AAR)。此记录应该是NDEF消息中的最后一条记录。(请注意,无论NDEF消息中的位置如何,都会执行AAR,但将其用作第一条记录将导致你在问题中链接的帖子中描述的问题。)
一旦你准备好包含适当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 Forum外部类型:

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

如果您的应用程序没有具有NDEF_DISCOVERED意图过滤器的匹配NDEF消息上的第一个记录,并且您的标签包含Android应用程序记录,则在您的清单中声明了具有android.intent.action.MAIN意图过滤器和带有android.intent.category.LAUNCHER的第一个活动将被启动。因为该活动并没有声明期望接收NFC意图,所以它将被传递android.intent.action.MAIN(其中不包含NDEF消息/标签句柄)。


非常感谢您提供这个信息丰富的答案!现在我对这个话题的理解更加清晰了 :) - sanevys
1
如果接收设备没有安装应用程序,有没有办法获取负载?我希望在他们安装之后,他们仍然可以获得意图。 - hooby3dfx
@hooby3dfx 你的意思是在同一个标签页上吗?即 NFC 交互 -> Play Store -> 用户安装应用程序 -> 用户手动打开应用程序 -> 接收数据负载? - Michael Roland
确切地说 - 因此,如果接收者还没有该应用程序,在安装后,发送者无需再次点击。 - hooby3dfx
2
@hooby3dfx 不好意思,安卓系统不支持此功能。 - Michael Roland
那将是一个很棒的功能 :) - Akilan Arasu

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接