Android NFC无法与ICS合作

时间:2012-03-01 13:36:59

标签: android nfc

昨天我看了谷歌IO谈论NFC,今天我正试着用它做一些有趣的事情。

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

我也在关注这个方法,以便通过一些评论来理解这个流程: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()

更新

我对默认的Sticky Notes代码进行了一些更改,以便将其升级为支持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,   活动,活动......)而不是:它自动挂钩到你的   活动生命周期,所以你不需要在你的呼叫中启用/禁用   的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,设备还是我的代码的问题。 所以我不明白的是:如果一切正常,当我更改Sticky Note编辑文本的文本并将2个设备与NFC链接时,文本将被发送到另一个设备?这是一个例子吗?

真奇怪的是,我找不到有关如何使用ICS进行NFC的示例,官方文档并没有解释得那么好......

有人知道如何解决?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

感谢您的回答。

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

在ICS中启用NFC选项时,它将启用您的&#34;读取&#34;功能。 当您启用Android Beam功能时,它还会启用&#34; write&#34;功能

我正在禁用Android Beam功能,因此这是一个大问题!