如果手机已经在旁边,Android应用程序不会发现NFC标记

时间:2014-10-14 20:30:34

标签: android nfc

想象一下以下场景: 读取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;重现相同的行为。和我自己的应用程序。

有没有人对此有解释,或者我错过了什么?

2 个答案:

答案 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意图。否则,标签被忽略。