【问题标题】:How to send a string using NFC from a windows phone 8 to an android device如何使用 NFC 从 Windows Phone 8 向 Android 设备发送字符串
【发布时间】:2012-12-20 20:28:41
【问题描述】:

没有任何运气使用谷歌,所以我想我会问。

有没有人有任何经验/知道如何从 Windows Phone 8 设备向 Android 设备发送一个简单的字符串,即“hello”?

到目前为止,我们已经能够做 android -> android 和 android -> windows phone 8,但我们还没有找到从 windows phone 8 到 android 的方法。

有没有人在网上看过指南或知道如何做这样的事情?

我想第一步是找出如何让windows phone 8上的应用程序实现它靠近android NFC设备..然后是弄清楚如何让android手机上的应用程序接收到消息。

提前致谢!

* 回答 *

好的,这里有一些答案/提示

我最终将 NFC 消息作为外部类型发送,因为发送 application/my.mimetype 一直在 Windows 手机上给我一个“抱歉你的手机无法识别这种类型的文件”,即使消息正在通过。

@Override
public NdefMessage createNdefMessage(NfcEvent event) {

    NdefMessage ndefMessage = new NdefMessage(( 
            new NdefRecord[] {createMimeRecord("packageName:externalType",docId.getBytes())}));

    return ndefMessage;
}

public NdefRecord createMimeRecord(String mimeType, byte[] payload) {
    byte[] mimeBytes = mimeType.getBytes(Charset.forName("US-ASCII"));
    NdefRecord mimeRecord = new NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE, mimeBytes, new byte[0], payload);
    return mimeRecord;
}

您在 android 中所要做的就是遵循 SDK 示例 (android-16/17 - AndroidBeamDemo) 中的 android 示例,这在此处进行了非常彻底的解释 - http://www.tappednfc.com/wp-content/uploads/TAPPED-NFCDeveloperGuide-Part1.pdf

但不要使用应用程序 mimetype,而是使用上述外部类型,并在您的清单中将以下内容而不是 mimetype 放入意图过滤器中:

                <data
                android:host="ext"
                android:pathPrefix="/cco.drugformulary:externalType"
                android:scheme="vnd.android.nfc" />

关于从 Windows Phone 读取和发送消息,您可以使用接受的答案家伙所说的内容,它应该可以工作,但类型 put cco.drugformulary:externalType 如上所述(当然是您的项目名称)。

如果您遇到任何问题,请随时问我

【问题讨论】:

    标签: android windows nfc windows-phone-8 ndef


    【解决方案1】:

    在使用 WP8 NFC 时,您可以使用两种类型的消息:特定于窗口的消息和 NDEF 消息。 Windows 特定消息很容易发现,因为您将它们作为“Windows.*”消息类型发布。然而,NDEF 消息使用“NDEF”消息类型发布。例如,这是一条特定于 Windows 应用程序的消息:

        private void WriteAppSpecificStringToTag(object sender, RoutedEventArgs e)
        {
            ProximityDevice device = ProximityDevice.GetDefault();
    
            if (device != null)
            {
                device.PublishBinaryMessage("Windows:WriteTag.myApp",
                    GetBufferFromString("Hello World!"),
                    UnregisterOnSend);
    
                MessageBox.Show("Tap to write 'Hello World' on tag.");
            }
        }
    

    NDEF 是一种广泛使用的跨平台格式,旨在针对 NFC 标签的空间受限环境(通常小于 100 字节)进行优化。虽然 WP8 Proximity 框架允许发送和接收 NDEF 消息,但它对 NDEF 格式一无所知。这意味着,WP8 邻近框架发送和接收字节流。解析该字节流并正确格式化是您作为应用程序开发人员的责任。

    为了格式化和解析 NDEF 消息,您需要使用第 3 方框架或构建自己的框架。就 3rd 方框架而言,NDEF Library for Proximity APIs 做得很好。

    例如,以下是如何使用NDEF Library 格式化和编写特定于应用的 NDEF 消息:

        private void WriteNDEFRecordToTag(object sender, RoutedEventArgs e)
        {
            ProximityDevice device = ProximityDevice.GetDefault();
    
            if (device != null)
            {
                device.PublishBinaryMessage("NDEF:WriteTag",
                    new NdefMessage()
                    {
                        new NdefRecord
                        {
                            TypeNameFormat = NdefRecord.TypeNameFormatType.ExternalRtd,
                            Type = "myApp".Select(c => (byte) c).ToArray(),
                            Payload = "Hello World!".Select(c => (byte) c).ToArray()
                        }
                    }.ToByteArray().AsBuffer(),
                    UnregisterOnSend);
    
                MessageBox.Show("Tap to write 'Hello World' on tag.");
            }
        }
    

    以下是在您的应用中接收和解析 NDEF 消息的方法:

        private void ReadNDEFRecordFromTag(object sender, RoutedEventArgs e)
        {
            ProximityDevice device = ProximityDevice.GetDefault();
    
            if (device != null)
            {
                device.SubscribeForMessage("NDEF", ndefMessageRecieved);
    
                MessageBox.Show("Registered to NFC tag. Tap with NFC tag.");
            }
        }
    
        private void ndefMessageRecieved(ProximityDevice sender, ProximityMessage message)
        {
            var ndefMessage = NdefMessage.FromByteArray(message.Data.ToArray());
    
            StringBuilder sb = new StringBuilder();
            foreach (NdefRecord record in ndefMessage)
            {
                sb.AppendLine(Encoding.UTF8.GetString(record.Payload, 0, record.Payload.Length));
            }
            Dispatcher.BeginInvoke(() => MessageBox.Show(sb.ToString()));
        }
    

    当我们在 WP8 上运行这段代码 sn-p 并点击之前编写的 NDEF 标签时,我们可以看到以下消息:

    如果我们使用相同的 NFC 标签并使用 Android 的 NFC TagInfo 应用程序,我们可以看到相同的数据:

    如果您想知道使用 NDEF 时实际传输/传输的内容,这里是我们刚刚使用的标签上的 GoToTags Windows 应用程序:

    如果您觉得 NDEF 库有点繁重,您可以随时使用自己开发的 NDEF 格式化程序和解析器。在这个诺基亚 OSS 项目中有一个很好的例子@NFC Tag Reader

    关于 NFC 电话到电话与 NFC 电话到标签,上面的代码 sn-ps 将适用于任何一种情况。如果你想写一个标签,simlpy 将 ":WriteTag" 操作保留在消息类型中。如果您想直接与附近的手机通信,只需删除“:WriteTag”操作即可。两者都适用于 WP8Android。

    请注意,Android 和 WP8 处理 NDEF 的方式存在差异。 WP8 只能读取消息中的第一条 NDEF 记录,而 Android 可以读取所有 NDEF 记录。 Android 可以使用非 NDEF 格式的标签并对其进行格式化; WP8 必须使用 NDEF 格式的标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 2016-09-20
      • 2013-01-21
      相关资源
      最近更新 更多