使用谷歌搜索时没有任何运气,所以我想问一下。
有没有人有任何经验/知道如何从 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 标记时,我们可以看到以下消息:
如果我们采用相同的 NFC 标签并使用 Android 的 NFC TagInfo应用程序我们可以看到相同的数据:
如果您想知道在使用 NDEF 时实际传输/传输的是什么,这里是我们刚刚使用的标签上的 GoToTags Windows 应用程序:
如果 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/