【问题标题】:Android NFC not working with ICSAndroid NFC 不适用于 ICS
【发布时间】:2012-03-20 00:09:34
【问题描述】:

昨天我看了 Google IO Talk about NFC,今天我想用它做一些有趣的事情。

目前我有 Galaxy Nexus (ICS 4.0.2) 和 Nexus S (ICS 4.0.3)。 我已经安装了该演讲的示例应用程序:http://nfc.android.com/StickyNotes.zip

我也在按照这个方法来了解一些 cmets 的流程:http://www.jessechen.net/blog/how-to-nfc-on-the-android-platform/

我想要做的是以 p2p 方式从一部手机向另一部手机发送一条消息并更改 edittext 内容(就像示例必须做的那样!)。

我认为 NFC 消息正在发出,但另一部手机没有接收它... 有人知道为什么吗?

这是其中一部手机的 logcat(当这两部手机相互联系时):

03-03 15:37:47.842: W/NFC-LLC(446): bad LLC length byte d0
03-03 15:37:47.842: W/NFC-LLC(446): bad LLC length byte a6
03-03 15:37:47.842: W/NFC-LLC(446): bad LLC length byte 42
03-03 15:37:47.842: W/NFC-LLC(446): bad LLC length byte 1
03-03 15:37:47.842: W/NFC-LLC(446): bad LLC length byte fc
03-03 15:37:47.842: W/NFC-LLC(446): bad LLC length byte c1
03-03 15:37:48.264: D/NFC JNI(446): Discovered P2P Target
03-03 15:37:48.264: D/NfcService(446): LLCP Activation message
03-03 15:37:48.264: D/NfcService(446): NativeP2pDevice.MODE_P2P_TARGET
03-03 15:37:48.296: I/NFC JNI(446): LLCP Link activated (LTO=150, MIU=128, OPTION=0x00, WKS=0x01)
03-03 15:37:48.296: D/NfcService(446): Initiator Activate LLCP OK
03-03 15:37:48.296: I/NfcP2pLinkManager(446): LLCP activated
03-03 15:37:48.296: D/NfcP2pLinkManager(446): onP2pInRange()
03-03 15:37:48.467: D/dalvikvm(446): GC_FOR_ALLOC freed 3192K, 18% free 17750K/21575K, paused 19ms
03-03 15:37:48.467: I/dalvikvm-heap(446): Grow heap (frag case) to 20.515MB for 3265936-byte allocation
03-03 15:37:48.514: D/dalvikvm(446): GC_CONCURRENT freed <1K, 3% free 20939K/21575K, paused 4ms+3ms
03-03 15:37:51.264: I/NFC JNI(446): LLCP Link deactivated
03-03 15:37:51.264: D/NfcService(446): LLCP Link Deactivated message. Restart polling loop.
03-03 15:37:51.264: D/NfcService(446): disconnecting from target
03-03 15:37:51.264: I/NfcP2pLinkManager(446): LLCP deactivated.
03-03 15:37:52.022: D/NfcP2pLinkManager(446): Debounce timeout
03-03 15:37:52.022: D/NfcP2pLinkManager(446): onP2pOutOfRange()

更新

我对默认便笺代码进行了一些更改,以便将其升级为支持 ICS NFC API。 事实上,如果您查看文档,您可以看到:http://developer.android.com/reference/android/nfc/NfcAdapter.html#enableForegroundNdefPush%28android.app.Activity,%20android.nfc.NdefMessage%29

此方法已弃用。 改用 setNdefPushMessage(NdefMessage, Activity, Activity...)

强烈推荐使用新的setNdefPushMessage(NdefMessage, Activity, Activity...) 代替:它会自动连接到您的 活动生命周期,因此您不需要在您的 onResume/onPause。

我还读到:要使 NDEF 推送正常运行,其他 NFC 设备必须支持 NFC 论坛的 SNEP(简单 Ndef 交换协议)或 Android 的“com.android.npp”(Ndef 推送协议)。这在 Gingerbread 级别的 Android NFC 设备上是可选的,但 SNEP 在 Ice-Cream-Sandwich 及其他设备上是强制性的

我不明白如果使用 setNdefPushMessage 是否会自动支持 SNEP 协议,如果我必须进行其他更改。 目前,正如我所说,我正在使用 Galaxy Nexus (4.0.2) 和 Nexus S (4.0.3),我没有其他类型的设备可以进行测试。

我还为发送消息的适配器实现了 onNdefPushComplete,并且我看到它从未调用过。我不明白这是否是关于 APIS、设备或我的代码的问题。 所以我不明白的是:如果一切正常,当我更改便笺编辑文本的文本并将两台设备与 NFC 链接时,文本将被发送到另一台设备?就是这个例子吗?

真正奇怪的是,我找不到有关如何使用 ICS 进行 NFC 的示例,而且官方文档也没有很好地解释它......

有人知道怎么解决吗?

【问题讨论】:

    标签: android nfc


    【解决方案1】:

    NPP 和/或 SNEP 的检测是完全自动的,在 NFC 软件堆栈内完成并且对应用程序隐藏。应用程序不需要知道这一点,setNdefPushMessage()setNdefPushMessageCallback() 将导致您的 NDEF 消息通过 SNEP 发送,如果两个设备都支持它,则通过 NPP 发送。

    您的问题可能与 Nexus S 和 Galaxy Nexus 中的 NFC 天线位置稍有不同有关。在 Nexus S 中,它更靠近背面的上部(天线位于手机背面的内侧;打开它可以看到),而在 Galaxy Nexus 中,它已集成在电池中,它更靠近背面的底部。

    当 2 部手机通过 NFC 连接时,您应该会听到声音(音量由铃声音量控制)并且屏幕应该“缩小”,同时显示“触摸发送”消息。 (当然,你要确保在手机的设置中开启了NFC和Beam。)

    【讨论】:

    • 我犯了一个大错误。我坚持启用 NFC 和禁用 Beam 功能仍然可以使 NFC 工作。我了解到启用 NFC 启用标签的读取部分,启用 ICS 中的 Beam 启用写入部分。所以总而言之,我的设备能够读取但不能写入:) 现在一切正常:)
    【解决方案2】:

    我在两部 Galaxy Nexus 手机 (ICS 4.0.1) 上按原样试用了 StickyNotes Demo(没有任何代码更改),它运行良好(如果您不触摸“写入标签”按钮!!! )。

    当您通过点击屏幕确认“Touch to Beam”-屏幕时,它只是将编辑后的文本发送到另一部手机。

    我没有做任何更改,它仍然在 android:minSdkVersion="10" (android 2.3.3) 上。

    【讨论】:

      【解决方案3】:

      感谢您的回答。

      正如我在回答的评论中所说,我犯了一个大错误。

      在 ICS 中,当您启用 NFC 选项时,它将启用您的“读取”功能。 当您启用 Android Beam 功能时,它也会启用“写入”功能。

      我禁用了 Android Beam 功能,所以这是个大问题!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-08
        • 1970-01-01
        相关资源
        最近更新 更多