【问题标题】:Android app does not discover NFC tag if phone already next to it如果手机已经在它旁边,Android 应用程序不会发现 NFC 标签
【发布时间】:2014-10-14 20:30:34
【问题描述】:

想象以下场景: 读取 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>

我的应用程序将在标签被发现后启动,但它只打开“readTag”活动。我仍然需要重新定位手机才能读取有效负载。

我能够使用“NFC 工具”和我自己的应用重现相同的行为。

有人对此有解释吗,还是我遗漏了什么?

【问题讨论】:

  • 发布你的readTag活动代码

标签: android nfc


【解决方案1】:

对于您的“readTag”活动由于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 中引入的阅读器模式 API 似乎有一个未记录的功能(或者可能只是一个错误!?):每当阅读器模式 API 被禁用/启用时,都会重新检测到标签。因此,您可以实施一种机制,在您的活动开始时强制重新发现标签。

【讨论】:

    【解决方案2】:

    似乎我在我的 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 意图。否则,标签被忽略。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多