我正在尝试将URI / URL写入NFC标签。我能够成功地做到这一点,但有一个前缀会自动添加到我写的URI中。
例如:如果我要写的URL是“https://indies.net.in”,那么实际写在标签上的URL是“https://www.enindies.net.in ”
有人可以告诉我,我在这里做错了吗?
private NdefMessage createNdefMessage(String content){
NdefRecord ndefRecord= createTextRecord(content);
NdefMessage ndefMessage=new NdefMessage(new NdefRecord[]{ndefRecord});
return ndefMessage;
}
private NdefRecord createUrlRecord(String content) {
try{
byte[] language;
language= Locale.getDefault().getLanguage().getBytes();
final byte[] text=content.getBytes("UTF-8");
final int languageSize=language.length;
final int textLength=text.length;
final ByteArrayOutputStream payload= new ByteArrayOutputStream(1+languageSize+textLength);
payload.write((byte) (languageSize & 0x1F));
payload.write(language,0,languageSize);
payload.write(text,0,textLength);
return new NdefRecord(NdefRecord.TNF_WELL_KNOWN,NdefRecord.RTD_URI,new byte[0],payload.toByteArray());
}catch (Exception e){
Log.e("createTextRecord",e.getMessage());
}
return null;
}
private void writeNdefMessage(Tag tag, NdefMessage ndefMessage){
try {
if (tag== null){
Toast.makeText(this," Tag object cannot be null",Toast.LENGTH_SHORT).show();
return;
}
Ndef ndef=Ndef.get(tag);
if (ndef==null){
formatTag(tag,ndefMessage);
} else {
ndef.connect();
if (!ndef.isWritable()){
Toast.makeText(this," Tag cannot be Written",Toast.LENGTH_SHORT).show();
ndef.close();
return;
}
ndef.writeNdefMessage(ndefMessage);
ndef.close();
Toast.makeText(this," Tag Written!",Toast.LENGTH_SHORT).show();
}
答案 0 :(得分:2)
将URL写入NFC标签的方法的问题在于,您似乎已经从最初打算写入NFC论坛 Text 记录的代码中复制了该代码。您的方法似乎最初被称为“ create 文本记录”(至少这就是您在createNdefMessage
中调用的方法),这也表明了这一点。
现在的问题是文本记录和URI记录具有完全不同的格式。因此,如果将Text记录的有效内容放入URI记录,则会得到意外的结果。在您的情况下,状态字节(文本记录的第一个字节,包含语言字段的大小)已映射到URI记录的标识符代码。由于该字段的值为0x02,因此将其转换为URI前缀“ https://www”。此外,语言字段本身(包含语言代码“ en”)已添加到URI。
通常,您可能希望使用方法NdefRecord.createUri()
为您的URL创建正确的URI记录。这将自动根据NFC论坛URI记录类型定义的压缩方案来对URI进行标准化和压缩。
NdefRecord ndefRecord= NdefRecord.createUri("https://indies.net.in");
但是,如果需要在API 14(引入此方法的地方)之前支持平台,则也可以手动创建URI记录。例如,如果您不关心压缩,则可以使用:
private NdefRecord createUrlRecord(String url) {
byte[] uriBytes = content.getBytes("UTF-8");
byte[] payload = new byte[uriBytes.length + 1];
payload[0] = (byte)0x00;
System.arraycopy(uriBytes, 0, payload, 1, uriBytes.length);
return new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
NdefRecord.RTD_URI,
null,
payload);
}
NdefRecord ndefRecord= createUrlRecord("https://indies.net.in");