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

Я делаю свое NFC писать в AsyncTasksdoInBackground(), Когда я пишу 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).

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,

Другие вопросы по тегам