Почему я получаю IOException при создании метки NFC только для чтения

1

Я делаю свое NFC запись в AsyncTasks doInBackground(). Когда я пишу NdefRecord, он работает хорошо, но когда я пытаюсь сделать только тег, я получаю IOException. Вот код, в котором происходит исключение:

  if (readOnly && !ndef.canMakeReadOnly()) {
        throw new NdefCantMakeReadOnlyException(R.string.cant_make_read_only);
    } else if (readOnly) {
        ndef.makeReadOnly(); //IOException
    }

Это makeReadOnly работает с тегами Mifare Ultralight (MF0ICU1).

Теги:
nfc
ndef

1 ответ

1
Лучший ответ

Просмотр через источник Android 4.4.2 (я не проверял со старыми версиями) показывает, что вы всегда получите IOException если makeReadOnly() по какой-либо причине не работает. Таким образом, вы обнаружили ошибку в Android или, по крайней мере, несоответствие с документацией API.

Причина в том, что android.nfc.tech.Ndef (см. Здесь, начиная с строки 383) ожидает, что служба NFC вернет ErrorCodes.SUCCESS для успешной блокировки ErrorCodes.ERROR_INVALID_PARAM для неудачной блокировки и ErrorCodes.ERROR_IO для любой связанной с IO ошибки. Однако служба NFC возвращает ErrorCodes.SUCCESS, если блокировка завершается успешно (см. Здесь, строка 1438) и ErrorCodes.ERROR_IO, если по какой-либо причине блокировка завершена (см. Здесь, строка 1440). ErrorCodes.ERROR_INVALID_PARAM похоже, вообще не возвращается, поэтому метод makeReadOnly() обычно никогда не возвращает false.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню