如何在Windows Phone 8上使用NFC向Android设备发送字符串

13

我在谷歌上没有找到相关信息,所以想问一下有没有人有经验或知道如何从Windows Phone 8设备向Android设备发送一个简单的字符串,比如“hello”?到目前为止,我们已经能够实现Android -> Android和Android -> Windows Phone 8,但是我们还没有找到如何从Windows Phone 8到Android的方法。是否有人看过在线指南或知道如何做到这一点?首先,我想找出如何让Windows Phone 8上的应用程序意识到它靠近一个安卓NFC设备......然后就是找出如何使安卓手机上的应用程序接收消息。

感谢您的帮助!

* 答案 *

好的,以下是一些答案/提示:

我最终将NFC消息作为外部类型发送,因为发送应用程序/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)的说明进行操作,这里有非常详细的解释 - http://www.tappednfc.com/wp-content/uploads/TAPPED-NFCDeveloperGuide-Part1.pdf。但是,不要使用应用程序mimetype,而要使用上面提到的外部类型,在你的清单文件中,将intent过滤器中的mimetype替换为以下内容:
                <data
                android:host="ext"
                android:pathPrefix="/cco.drugformulary:externalType"
                android:scheme="vnd.android.nfc" />

关于从Windows手机阅读和发送消息,您可以使用被接受答案的方法,应该可以工作,但是对于类型,请将cco.drugformulary:externalType放在上面(当然使用您自己的项目名称)。

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

1个回答

19
使用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 proximity框架发送和接收一系列字节流。解析该字节流并正确格式化它是您作为应用程序开发人员的责任。
为了格式化和解析NDEF消息,您需要使用第三方框架或构建自己的框架。就第三方框架而言,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上运行此代码片段并轻敲先前编写的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格式化程序和解析器。在这个Nokia OSS项目@NFC标签读取器中有一个很好的例子。
关于NFC手机对手机与NFC手机对标签之间的区别,上面的代码片段适用于任何一种情况。如果您想要写入标签,请在消息类型中保留“:WriteTag”操作。如果您想直接与附近的手机通信,请删除“:WriteTag”操作。两者都可以在WP8 <=> Android上很好地工作。
请注意,Android和WP8处理NDEF的方式有所不同。WP8只能读取消息中的第一个NDEF记录,而Android可以读取所有NDEF记录。Android可以使用非NDEF格式的标签并进行格式化;WP8必须使用NDEF格式化的标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接