想象一下以下场景: 读取NFC标签内容的应用程序尚未启动。我的手机在标签旁边。我启动了应用程序,并期待" readTag"阅读我的标签的活动,但它没有。只有当我将手机从标签移开时,它才会起作用,并将其再次放在标签旁边。
我想这是因为ACTION_TAG_DISCOVERED事件已经发生了。然后重新定位手机会有所帮助,因为应用程序正在运行且ACTION_TAG_DISCOVERED再次发生。
如果我使用
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
我的应用程序将在标记被发现后启动,但它只会打开&#34; readTag&#34;活动。然后我仍然需要重新定位手机才能读出有效载荷。
我能够使用&#34; NFC工具&#34;重现相同的行为。和我自己的应用程序。
有没有人对此有解释,或者我错过了什么?
答案 0 :(得分:0)
对于你的&#34; readTag&#34;由于NDEF_DISCOVERED
意图过滤器启动了活动,您显然遗漏了一些东西。作为意图附加内容的一部分,您将收到触发意图的Tag
对象(以及NdefMessage
)。因此,您只需要获取启动您的活动的意图(可以使用Activity.getIntent()
检索),提取相关的额外意图(例如Tag
对象)并将其传递给您的标记处理:
public void onStart() {
...
Intent intent = getIntent();
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
processTag(tag);
}
对于手动启动活动的情况,没有正式方法可以访问标记而无需将其重新附加到设备。但是,使用Android 4.4中引入的Reader Mode API似乎有一个未记录的功能(或者只是一个bug!?):每当禁用/启用阅读器模式API时,标记将被重新检测。因此,您可以实施一种机制,在您的活动开始时强制重新发现标签。
答案 1 :(得分:0)
我的procesTag(..)函数似乎忘记了一个案例。
现在我有了
public void procesTag(Intent intent) {
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction()) ||
NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
...
而不是
public void procesTag(Intent intent) {
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction()) {
...
因为我正在使用NDEF_DISCOVERED意图。否则,标签被忽略。