Почему я получаю IOException при создании метки NFC только для чтения
Я делаю свое 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).
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
,