2012-12-11 29 views
0

我开发了2个Android应用程序。第一个是写入NFC标签,第二个是读我写的内容。将NDEF记录隐藏到NDEF消息中?

这是我的第一个应用程序(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)读的当然,我在屏幕上只有第二个记录的有效载荷,我通过“记录类型”存储。但是对于第三方应用程序,特别是在照片中显示的本地安装(“标记”)应用程序,它显示正确的第一个记录,第二个应用程序是空的字段。我怎样才能隐藏这个领域。否则,我如何强制其他第三方应用程序不读第二个记录?

enter image description here

回答

3

你根本无法做到这一点。 Android将读取完整的NDEF消息(即所有记录),并将其在Intent中传递给应用程序。

0

乌普斯,难怪这是发生,看看你的代码。首先

return new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI, empty, empty, payload); 

然后

return new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI, payload, empty, empty); 

因此,第三方应用程序的真正显示正确的数据,你有你的记录创建一个bug。

android中的本地NDEF支持有点粗糙(基于字节数组),所以我写了一个library,它有助于创建记录 - 您可能会感兴趣。上面的问题可能很容易解决,但还有很多其他更复杂的记录类型,所以一些帮助可能会派上用场;-)

编辑:所以如果这是首选结果,而是创建一个未知记录和将你的'秘密'数据作为有效载荷 - 对任何第三方应用程序来说都不会有任何好的显示方式 - 而绝对URI记录的ID当然可以由任何NDEF阅读应用程序显示(如mine?)

+0

亲爱的托马斯在我的应用程序中没有错误。我只是选择将有效载荷作为记录类型,并在有效载荷字段中清空。 [如你所见,我使用getType()而不是getPayload()]。 通过这种方式,第三方应用程序将显示一个空白字段。这不是我正在寻找什么,但至少它显示一个空的字段,而不是第二个记录! – mOmO

+0

好的。查看更新的回复。 – ThomasRS

+0

我已经使用过未知记录。事实上,第三方应用程序不会显示第二条记录的数据。但是,当我们使用TNF_UNKNOWN记录时,类型字段应该是空的。结果,第三方应用程序显示特定消息:“未知标签类型”。 同样的事情,当我们使用TNF_EXTERNAL_TYPE! – mOmO

0

这个第三方应用程序对我来说很麻烦,所以我不得不使用foregroundDispatch手动读取标签内容,在那里您可以自由阅读或不阅读任何您想要的内容。 这段代码来自On​​Resume()。 `

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

     }` 

这里我得到第一条记录的有效载荷。