写入NFC标签时,会在URL / URI中添加意外的前缀

时间:2018-06-09 06:41:05

标签: android format uri nfc ndef

我正在尝试将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;
}

创建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();
        }

1 个答案:

答案 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");