Ошибка подключения при чтении тегов Android NfcV
У меня есть приложение для Android, которое читает теги NFC. Все отлично работает на LG Nexus 4, но на Samsung Galaxy S5 я получаю только исключения ввода-вывода (проверено на нескольких телефонах).
Итак, теги имеют тип NfcV, и я получаю исключение ввода-вывода при вызове connect()
на NfcV (далее это код ошибки -5 ERROR_CONNECT).
NFC TagInfo от NXP может считывать содержимое памяти тега на SG5S - есть ли другие способы чтения тегов NfcV, чем с connect()
а также transceive()
?
Какие различия между чипами NFC приведут к сбою соединения моего приложения на одном телефоне, но не на другом (в то время как другие приложения читают это нормально)? Есть ли таймауты, которые мне нужно настроить?
Фрагмент кода:
NfcV nfcvTag = NfcV.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG));
if(nfcvTag!=null){
try {
nfcvTag.connect();
//{flags:0x00, read multiple blocks command: 0x23, start at block 0: 0x00, read 9 blocks (0 to 8): 0x08}
response = nfcvTag.transceive(new byte[] {(byte)0x00,(byte)0x23,(byte)0x00,byte)0x08});
} catch (IOException e) {
Log.d("NFCService", nfcvTag.toString());
} finally {
try {
nfcvTag.close();
} catch (IOException e) {
}
}
}
1 ответ
Итак, подведем итог тому, что мы узнали во время обсуждения в приведенных выше комментариях:
Кажется, что вы не можете использовать
IntentService
обрабатывать доступ к тегу NFC (через полученное намерение обнаружения NFC) в отдельном потоке. В этом случае тег технологии объектаconnect()
метод не удастся.
Это не означает, что вы не можете обрабатывать доступ к тегу в отдельном (рабочем) потоке. На самом деле вам не следует обращаться к тегу в основном потоке (UI), так как это заблокирует приложение (и его UI) на время доступа к тегу и может привести к тому, что ваше приложение будет убито системой из-за отсутствия ответа. Ручное создание рабочего потока, который обрабатывает доступ к тегу, работает просто отлично.
Мои личные и непроверенные идеи / дикие догадки, почему IntentService
не удалось обработать тег:
- Это могло быть в случае передачи намерения об обнаружении NFC
IntentService
Введена значительная задержка между открытием тега и фактическим доступом к тегу. Во время этой задержки связь с меткой могла оборваться (например, из-за неправильного выравнивания пользователем ридера и антенн метки, что делает связь невозможной и т. Д.) - (У меня недостаточно знаний о внутреннем оборудовании системной службы Android NFC, чтобы понять, возможно ли это вообще:)
Tag
объект каким-то образом связан сActivity
, КакIntentService
является другим компонентом (хотя и выполняется в том же контексте приложения), возможно, ему не разрешен доступ кTag
объект.
Кажется, что контроллер NFC, используемый в Galaxy S5, поддерживает только адресные команды READ ISO/IEC 15693. Использование безадресных команд (т. Е. Команд, для которых не установлен флаг адреса и которые не содержат UID тега) приводит к
{ 0x02 }
возвращается изtransceive()
метод.
Трудно сказать, так ли это, как правило, с контроллером NFC (PN547? От NXP) в S5 или это что-то, что специфично для того, как тег обрабатывает адресные команды по сравнению с безадресными командами и ответами.