如何在Android中的NFC标签上将数据写为多条记录?

时间:2017-08-21 05:27:07

标签: java android tags nfc ndef

我跟着this将数据写入NFC标签。

这是我的MainActivity和我的NFCManager

我成功地将数据写入NFC标签。

但它仅将数据放在Record 0中。标签上没有创建其他记录。

但是,我想将数据放入多个记录中,例如Record 0Record 1Record 2Record 3

所以我像这样修改了MainActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    nfcMger = new NFCManager(this);

    v = findViewById(R.id.mainLyt);

    final EditText et0 = (EditText) findViewById(R.id.cnt0);
    final EditText et1 = (EditText) findViewById(R.id.cnt1);
    final EditText et2 = (EditText) findViewById(R.id.cnt2);
    final EditText et3 = (EditText) findViewById(R.id.cnt3);

    FloatingActionButton btn = (FloatingActionButton) findViewById(R.id.fab);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String ct0 = et0.getText().toString();
            String ct1 = et1.getText().toString();
            String ct2 = et2.getText().toString();
            String ct3 = et3.getText().toString();


            message =  nfcMger.createUriMessage(ct0, "id");
            message =  nfcMger.createUriMessage(ct1, "name");
            message =  nfcMger.createUriMessage(ct2, "role");
            message =  nfcMger.createUriMessage(ct3, "level");


            if (message != null) {

                dialog = new ProgressDialog(MainActivity.this);
                dialog.setMessage("Tag NFC Tag please");
                dialog.show();
            }
        }
    });

}

但是当我使用它并将数据写入标记时,它只在标记上存储Record 0。没有其他记录。

我只收到Record 0中最后保存的数据:

我的期望是将数据写入多个记录,如下所示:

有人可以建议我如何将数据插入多个记录(Record 0Record 1Record 2Record 3)吗?

更新

参考用户@ Michael Roland我已更新我的代码我收到此错误

enter image description here

我遵循Method NdefRecord.createTextRecord(“en” , “string”) not working below API level 21并且我已经提供了NdefRecord方法,但是当我为message = new NdefMessage(new NdefRecord[] {

提供相同内容时显示错误

所以消息旁边不是错误,但我希望它在消息中

感谢@Michael Roland的支持

1 个答案:

答案 0 :(得分:2)

您只能在标记上找到一条包含一条记录的消息,因为这是您在代码中执行的操作。在这里,您可以创建一条包含一条URI记录的NDEF消息:

message =  nfcMger.createUriMessage(ct0, "id");

在下一行右侧,用另一条只包含一条URI记录的NDEF消息覆盖以前存储的消息(在message中引用):

message =  nfcMger.createUriMessage(ct1, "name");

在接下来的两行中你再次做同样的事情:

message =  nfcMger.createUriMessage(ct2, "role");
message =  nfcMger.createUriMessage(ct3, "level");

因此,只有最后一行才能在message中有效地存储NDEF消息。

然后,您可能会将该消息存储到标签 1

但是,根据上面的屏幕截图,您可能更愿意创建一条包含4条文本记录的NDEF消息。例如。像这样:

message = new NdefMessage(new NdefRecord[] {
        NdefRecord.createTextRecord("en", "Text 1"),
        NdefRecord.createTextRecord("en", "Text 2"),
        NdefRecord.createTextRecord("en", "Text 3"),
        NdefRecord.createTextRecord("en", "Text 4"),
});

顺便说一下。由于createTextRecord()仅从API级别21开始提供,因此您可能需要查看Method NdefRecord.createTextRecord("en" , "string") not working below API level 21以获得较低的API级别。

另请注意,文本记录用于存储人类可读的文本数据。为了存储机器可读信息,其他记录(例如NFC论坛外部类型)将更合适。

1 )尽管如此,你似乎不愿意提出MCVE,但相信你的问题的读者会想要浏览GitHub上大量不必要的代码来理解你的问题。请注意,该问题的整个生命周期内甚至可能不存在该代码,一旦该源代码消失,您的问题对其他人来说将毫无用处。

最后请注意,如果你真的在标签上观察到一个text / plain类型的文本值为“junior”的记录,你肯定没有使用GitHub中的代码而没有进一步修改,因为你公开的代码会创建一个(格式错误的?)URI记录。