如何通过 NFC 将文本字符串发送到另一台设备?

How can I send a text string to another device via NFC?

我想创建一个迷你应用程序来读取 NFC 标签,然后发送到 Android 上的另一台设备。那部分已经完成,我可以读取标签,我可以在 EditText 上打印字符串。但我也想将我从该标签读取的文本发送到具有 NFC 的另一台设备。我该怎么做?

//I have this code here when a tag is discovered...
@Override
protected void onNewIntent(Intent intent) {
    if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)) {
        String result = "";
        result = ByteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID));
        myTag = result;
        txtTag.setText(myTag);

    }
}

如何通过 NFC 将文本字符串发送到另一台设备?

你想做的事 Android 根本不可能,不(将来可能不会)。

您当前读取的防冲突标识符(UID、PUPI 或您读取的特定标签平台的任何名称):

result = ByteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID));

防冲突标识符是非常低的协议层的一部分。虽然 Android 确实支持基于主机的卡模拟(参见 Android HCE),但 Android API 无法控制诸如 UID 之类的低级参数。通常,也无法更改 NFC 标签上的信息。

请注意,如果您的标签还包含一些 NDEF 格式的高级数据,您可以使用以下方法获取:

Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage msg = null;
if ((rawMsgs != null) && (rawMsgs.length > 0)) {
    msg = (NdefMessage)rawMsgs[0];
}
if (msg != null) {
    // do something with the received message
}

Android 确实支持将这些 NDEF 消息存储在(可写)NFC 标签上,它还支持将 NDEF 消息发送到其他 NFC 设备(参见 Beaming NDEF Messages to Other Devices)。

  • 例如要在 NFC 标签上存储 NDEF 消息,您可以使用:

    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    Ndef ndef = Ndef.get(tag);
    if (ndef != null) {
        try {
            ndef.connect();
            ndef.writeNdefMessage(msg);
        } finally {
            ndef.close();
        }
    } else {
        NdefFormatable ndefFormatable = NdefFormatable.get(tag);
        if (ndefFormatable != null) {
            try {
                ndefFormatable.connect();
                ndefFormatable.format(message);
            } finally {
                ndefFormatable.close();
            }
        }
    }
    
  • 或者为了通过对等模式(Android Beam)将消息发送到另一个 NFC 设备,您可以使用:

     NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
     nfcAdapter.setNdefPushMessage(msg, this);