Неожиданный префикс добавляется к URL / URI при записи в тег NFC - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь записать 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 голосов
/ 21 июня 2018

Проблема с вашим методом записи URL в тег NFC заключается в том, что вы, похоже, скопировали его из кода, который изначально предназначался для записи записей NFC Forum Text .Это также подтверждается тем фактом, что ваш метод первоначально назывался «create Text Record» (по крайней мере, это то, что вы называете в createNdefMessage).

Теперь проблема сэто то, что текстовые записи и записи URI имеют совершенно другой формат.Следовательно, если вы поместите полезную нагрузку текстовой записи в запись URI, вы получите неожиданный результат.В вашем случае байт состояния (первый байт текстовой записи, содержащий размер языкового поля) был сопоставлен с кодом идентификатора записи URI.Поскольку значение этого поля было 0x02, оно было переведено в префикс URI "https://www.".. Более того, само поле языка (содержащее код языка" en ") было добавлено в URI.

Как правило, вы хотите использовать метод NdefRecord.createUri() для создания правильной записи URI для вашего URL.Это автоматически позаботится о нормализации и сжатии URI в соответствии со схемой сжатия определения типа записи URI Forum NFC.

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");
...