写入 NFC 标签时,意外前缀添加到 URL/URI
Unexpected prefix is added to URL/URI when writing to NFC tag
我正在尝试将 URI/URL 写入 NFC 标签。我能够成功地做到这一点,但是有一个前缀会自动添加到我编写的 URI 中。
例如:如果我要写的URL是"https://indies.net.in",那么tag上实际写的URL就是"https://www.enindies.net.in".
有人可以告诉我我做错了什么吗?
正在创建消息:
private NdefMessage createNdefMessage(String content){
NdefRecord ndefRecord= createTextRecord(content);
NdefMessage ndefMessage=new NdefMessage(new NdefRecord[]{ndefRecord});
return ndefMessage;
}
正在创建 URL 记录:
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();
}
您将 URL 写入 NFC 标签的方法存在问题,您似乎是从原本打算编写 NFC 论坛 Text[=25= 的代码中复制的] 记录。这也表明您的方法最初似乎被称为 "createTextRecord"(至少那是您在 createNdefMessage
中调用的)。
现在的问题是Text记录和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");
但是,如果您需要支持 API14(引入此方法的地方)之前的平台,您也可以手动创建 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");
我正在尝试将 URI/URL 写入 NFC 标签。我能够成功地做到这一点,但是有一个前缀会自动添加到我编写的 URI 中。
例如:如果我要写的URL是"https://indies.net.in",那么tag上实际写的URL就是"https://www.enindies.net.in".
有人可以告诉我我做错了什么吗?
正在创建消息:
private NdefMessage createNdefMessage(String content){
NdefRecord ndefRecord= createTextRecord(content);
NdefMessage ndefMessage=new NdefMessage(new NdefRecord[]{ndefRecord});
return ndefMessage;
}
正在创建 URL 记录:
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();
}
您将 URL 写入 NFC 标签的方法存在问题,您似乎是从原本打算编写 NFC 论坛 Text[=25= 的代码中复制的] 记录。这也表明您的方法最初似乎被称为 "createTextRecord"(至少那是您在 createNdefMessage
中调用的)。
现在的问题是Text记录和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");
但是,如果您需要支持 API14(引入此方法的地方)之前的平台,您也可以手动创建 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");