我开发了2个Android应用程序。第一个是写入NFC标签,第二个是读取我写的内容。
这是我在第一个应用程序(WriteNFC)中所做的
private NdefRecord createRecord1(String data)
{
byte[] payload = data.getBytes(Charset.forName("UTF-8"));
byte[] empty = new byte[] {};
return new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI, empty, empty, payload);
}
private NdefRecord createRecord2(String data)
{
byte[] payload = data.getBytes(Charset.forName("UTF-8"));
byte[] empty = new byte[] {};
return new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI, payload, empty, empty);
}
在第二个应用程序(ReadNFC)
中NdefRecord cardRecord = msg.getRecords()[1];//Extract the second Record
String url_data = new String(cardRecord.getType());//Read data type
当我使用自己的应用程序(ReadNFC)阅读时,我当然只在屏幕上显示第二个记录的有效负载,我通过“记录类型”存储。但是使用第三方应用程序,尤其是本地安装的(“标签”) - 显示在照片中 - 它正确显示第一个记录,而第二个应用程序显示为空字段。我该如何隐藏这个字段。否则,如何强制其他第三方应用程序不读取第二条记录?
答案 0 :(得分:3)
你根本做不到。 Android将读取完整的NDEF消息(即所有记录)并将其在Intent中传递给应用程序。
答案 1 :(得分:0)
Upps,难怪会发生这种情况,看看你的代码。第一
return new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI, empty, empty, payload);
然后
return new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI, payload, empty, empty);
因此,第三方应用程序确实显示了正确的数据,您的记录创建中存在错误。
android中的原生NDEF支持有些粗糙(基于字节数组),所以我编写了一个library来帮助创建记录 - 你可能会觉得它们很有趣。上面的问题可能很容易解决,但还有许多其他更复杂的记录类型,所以一些帮助可能派上用场;-)
编辑:因此,如果这是首选结果,而是创建一个未知记录并将您的“秘密”数据作为有效负载 - 对于任何第三方应用程序显示该数据将不是任何好方法 - 而ID绝对URI记录当然可以由任何NDEF阅读应用程序显示(如mine?)
答案 2 :(得分:0)
这个第三方应用程序对我来说很麻烦,所以我不得不使用foregroundDispatch手动读取标签内容,在那里你可以自由阅读或不读取任何你想要的东西。 此代码段来自OnResume()。 `
mNfcAdapter.enableForegroundDispatch(this, pendingIntent,
intentFiltersArray, techListsArray);
Toast.makeText(getApplicationContext(), "TAG disscovered",
Toast.LENGTH_LONG).show();
Parcelable[] rawMsgs = getIntent()
.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
NdefMessage[] msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) {
msgs[i] = (NdefMessage) rawMsgs[i];
setText=new String(msgs[i].getRecords()[0].getPayload());
}
mInfoText.setText(setText);
}
}`
这里我获得了第一条记录的有效载荷。