Невозможно отформатировать карту NFC с помощью NdefFormatable

Я использую класс NdefFormatable для форматирования карты NFC. Код выглядит так:

NdefFormatable formatable=NdefFormatable.get(tag);

Но я получаю форматируемую ссылку как нулевую. Я проверил код, который запускается внутри метода get(tag). Он проверяет:

if (!tag.hasTech(TagTechnology.NDEF_FORMATABLE)) return null;

Я запустил "tag.getTechList()" для своего тега. Я получил:

android.nfc.tech.NfcA
android.nfc.tech.Ndef

Я смог отформатировать эту карту с помощью приложения Trigger.

Что можно сделать, чтобы отформатировать это.


person jsbisht    schedule 26.08.2014    source источник


Ответы (2)


Технологии тегов NdefFormatable и Ndef являются взаимоисключающими. Либо ваш тег еще не отформатирован в формате NDEF (т. е. он еще не подготовлен для хранения сообщений NDEF), либо он уже подготовлен для хранения сообщений NDEF (и уже содержит (по крайней мере, пустое) сообщение NDEF).

Таким образом, NdefFormatable используется только для записи начального сообщения NDEF в тег.

Поскольку в вашем теге уже указана технология android.nfc.tech.Ndef, он уже подготовлен для хранения сообщения NDEF и не требует дальнейшего форматирования. Вы можете просто перезаписать (учитывая, что тег не предназначен только для чтения) любое существующее сообщение NDEF, используя метод writeNdefMessage() объекта Ndef. Например. чтобы «отформатировать» тег в пустое сообщение NDEF, вы можете сделать что-то вроде:

Ndef ndefTag = Ndef.get(tag);
ndefTag.writeNdefMessage(new NdefMessage(new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null)));

Обновление: кажется, что на устройствах со стеком NFC libnfc-nci технологии тегов NdefFormatable и Ndef больше не являются взаимоисключающими. Отформатированные теги будут (иногда?) нумероваться как NdefFormatable, так и Ndef. В этих случаях вы все равно обычно сначала пытаетесь использовать Ndef, и только если это не удается, используйте объект NdefFormatable.

person Michael Roland    schedule 27.08.2014
comment
Спасибо, Майкл. Было бы очень полезно, если бы вы также могли предоставить некоторую информацию о том, как отформатировать тег в формате NDEF, который в настоящее время не находится в формате NDEF. - person jsbisht; 29.08.2014
comment
@jsbisht Вы имеете в виду ту, в которой ни Ndef, ни NdefFormatable не указаны в качестве технологий тегов? - person Michael Roland; 29.08.2014
comment
Да, тег не в формате NDEF или NDEFFormatable. - person jsbisht; 29.08.2014
comment
@jsbisht Полный ответ на этот вопрос явно будет слишком широким для этого формата. Короткий ответ: это не так просто. Сначала вам нужно будет выяснить, с каким тегом вы имеете дело (путем обширного снятия отпечатков пальцев), а затем (если тег даже разрешает/поддерживает это) вам нужно будет применить метод этой конкретной технологии для форматирования его в тег форума NFC (согласно Спецификации работы тегов Type X Форума NFC). - person Michael Roland; 29.08.2014
comment
Это имеет смысл. Я надеялся, что может быть какой-то общий способ работы с тегами. Похоже, я должен просто придерживаться тегов NDEF. Спасибо :) - person jsbisht; 29.08.2014
comment
Фактически, это одна из причин, по которой метки NFC (например, серии NXP NTAG) обычно предварительно отформатированы для NDEF. - person Michael Roland; 29.08.2014
comment
@MichaelRoland, когда ndef == null я пытаюсь отформатировать тег. Тег ndefFormattable, но formattable.format() выдает IOexception - person Prabs; 10.08.2017

Ваше устройство не может отформатировать тег в формате NDEF. В противном случае вы бы получили android.nfc.tech.NdefFormatable в списке технологий.

Но вы по-прежнему можете читать и писать в формате NDEF в тег.

Я предполагаю, что Trigger просто записывает пустое сообщение в тег Ndef.

person Gak2    schedule 26.08.2014
comment
Спасибо Гак2. Я все еще верю, что будет какой-то способ отформатировать тег NFC, кроме использования пустого сообщения. - person jsbisht; 27.08.2014