关于这个问题的帖子不多,所以我想在这里提供一个详细的描述如何解决这个问题。
为了找到问题的根源,我查看了phonegap-nfc plugin itself的源代码,其中包含:
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(getActivity());
if (!nfcAdapter.isNdefPushEnabled()) {
callbackContext.error(STATUS_NDEF_PUSH_DISABLED);
}
所以问题不在于代码本身,而是来自 Android 设备的 NFC 适配器返回 NDEF 消息推送被禁用。所以我在设备上查看了我的 NFC 设置并启用了 Android Beam,它特别使用了 NDEF 点对点共享。通常您禁用此功能,因为它总是弹出并尝试在默认情况下共享您当前的应用程序信息,连接两个启用 NFC 的设备,这真的很烦人......
但在这种情况下,您必须启用并特别使用 Android Beam。我找到的解决方案是,您要使用nfc.share() 发送的消息只有在您执行应用程序代码并随后点击 Android Beam 弹出窗口时才会发送。执行此操作后,您的 NDEF 消息将使用 Android Beam 和您给定的消息发送到其他设备。为了发送和接收消息,我使用了以下代码:
nfc.addNdefListener(
function (nfcEvent) {
var tag = nfcEvent.tag,
ndefMessage = tag.ndefMessage;
// dump the raw json of the message, note: real code will need to decode the payload from each record
alert("NDS1 " + JSON.stringify(ndefMessage));
// assuming the first record in the message has a payload that can be converted to a string.
alert("NDS2 " + nfc.bytesToString(ndefMessage[0].payload).substring(3));
nfc.share([ndef.textRecord("Hello")], () => {alert("Success")}, (err) => alert(JSON.stringify(err)));
},
function () { // success callback when listener was enabled
alert("Waiting for NDEF tag");
},
function (error) { // error callback
alert("Error adding NDEF listener " + JSON.stringify(error));
}
)
您不必等到 NdefListener 可用,您可以在任何地方使用nfc.share(),当您点击 Android Beam 时,您只会收到回调。您使用 nfc.share() 提供的最后一条消息将使用 Android Beam 发送。
我希望这个错误描述可以帮助一些人使用 Cordova、Phonegap 或 Ionic 获得 NFC - NDEF 点对点消息传递。