Ошибка подключения при чтении тегов 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 не удалось обработать тег:

  1. Это могло быть в случае передачи намерения об обнаружении NFC IntentService Введена значительная задержка между открытием тега и фактическим доступом к тегу. Во время этой задержки связь с меткой могла оборваться (например, из-за неправильного выравнивания пользователем ридера и антенн метки, что делает связь невозможной и т. Д.)
  2. (У меня недостаточно знаний о внутреннем оборудовании системной службы Android NFC, чтобы понять, возможно ли это вообще:) Tag объект каким-то образом связан с Activity, Как IntentService является другим компонентом (хотя и выполняется в том же контексте приложения), возможно, ему не разрешен доступ к Tag объект.

Кажется, что контроллер NFC, используемый в Galaxy S5, поддерживает только адресные команды READ ISO/IEC 15693. Использование безадресных команд (т. Е. Команд, для которых не установлен флаг адреса и которые не содержат UID тега) приводит к { 0x02 } возвращается из transceive() метод.

Трудно сказать, так ли это, как правило, с контроллером NFC (PN547? От NXP) в S5 или это что-то, что специфично для того, как тег обрабатывает адресные команды по сравнению с безадресными командами и ответами.

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