android - 如何使用 NFC 将字符串从 Windows Phone 8 发送到 Android 设备

标签 android windows nfc windows-phone-8 ndef

使用谷歌搜索时没有任何运气,所以我想问一下。

有没有人有任何经验/知道如何从 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 Phone 上一直给我一个“抱歉,你的手机无法识别这种类型的文件”,即使消息正在通过。

@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,而是使用上面的外部类型,并在您的 list 中将以下内容而不是 Intent 过滤器中的 mimetype:

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

关于从 Windows Phone 阅读和发送消息,您可以使用已接受答案的人所说的那样,它应该可以工作,但对于上面的类型 put cco.drugformulary:externalType(当然是你的项目名称)。

如果你遇到任何问题随时问我

最佳答案

当使用 WP8 NFC 时,您基本上可以使用两种类型的消息:特定于 Windows 的消息和 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 方框架或构建您自己的框架。在第 3 方框架方面 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 上运行此代码 fragment 并点击之前编写的 NDEF 标记时,我们可以看到以下消息:

MessageBox saying Hello World

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

NfcTag Info data on Android

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

GoToTags showing the binary data stored in the NDEF tag

如果 NDEF 库对您来说感觉有点沉重,您可以随时启动自己开发的 NDEF 格式化程序和解析器。在诺基亚 OSS 项目 @ NFC Tag Reader 中有一个很好的例子。

关于 NFC phone-to-phone 与 NFC phone-to-tag,上面的代码 fragment 适用于任何一种情况。如果您想写入标签,只需在消息类型中保留“:WriteTag”操作即可。如果您想直接与附近的手机通信,只需删除“:WriteTag”操作即可。两者都适用于 WP8<=>Android。

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

关于android - 如何使用 NFC 将字符串从 Windows Phone 8 发送到 Android 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13979984/

相关文章:

android - 无法使用 MPAndroidChart 库优化折线图

windows - 我可以使用 win32 Setup API 检测 USB 设备何时插入或拔出吗?

windows - 如何让 GIT 将目录连接视为 Windows 上的常规文件夹?

Android Application Record 与 pre-ICS 的兼容性

android - 如何将外部 NFC 读卡器连接到平板电脑

android - 调用语音电话,获得应用程序内的感觉(或隐藏默认电话断开连接的用户界面)

android - 有没有办法像日历应用一样动态更改应用图标?

android - 将 URL 写入 NFC 芯片

android - 获取安卓联系人

c - Windows GDI : Difference Between a Pattern Brush & BitBlt of a Bitmap