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