如何通过NFC将文本字符串发送到其他设备?

时间:2016-05-23 14:58:42

标签: android tags nfc nfc-p2p android-beam

我想创建一个迷你应用程序,只是为了阅读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将文本字符串发送到其他设备?

1 个答案:

答案 0 :(得分:1)

你想要做的事情根本不可能用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支持在(可写)NFC标签上存储这些NDEF消息,并且还支持将NDEF消息发送到其他NFC设备(请参阅Beaming NDEF Messages to Other Devices)。

  • E.g。将NDEF消息存储在您可以使用的NFC标签上:

    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);