写入 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");