TagLostException при чтении карты NFC-F на Android

Я разрабатываю приложение для Android, которому необходимо считывать карту NFC (технология карты - NFC-F). Там я всегда получаю следующее исключение:

android.nfc.TagLostException: тег потерян.

Вот мой код:

private void handleIntent(Intent intent) {
    String action = intent.getAction();
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {

    } else if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {

    } else if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {

        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        if (tag != null) {
            NfcF nfcf = NfcF.get(tag);
            try {
                nfcf.connect();
                byte[] AUTO_POLLING_START = {(byte) 0xE0, 0x00, 0x00, 0x40, 0x01};
                byte[] response = nfcf.transceive(AUTO_POLLING_START);
                nfcf.close();
            } catch (Exception e) {
                e.printStackTrace();
                mTextView.setText(e.toString());
            }
        }
    }
}

Может ли кто-нибудь помочь мне в этом вопросе?


person chami    schedule 15.08.2017    source источник
comment
улучшенное форматирование   -  person Heshan Sandeepa    schedule 15.08.2017


Ответы (1)


Вы получаете TagLostException, поскольку отправляете тегу недопустимую команду. Поскольку теги NFC-F молчат при приеме недопустимых команд, Android не может отличить фактическую потерю связи от отрицательного ответа на неподдерживаемую/недопустимую команду и выдает TagLostException в обоих случаях.

Действительные команды FeliCa (NFC-F) имеют вид

+----------+----------+------------------+-----------------------------------------------+
| LEN      | COMMAND  | IDm              | PARAMETER                                     |
| (1 byte) | (1 byte) | (8 bytes)        | (N bytes)                                     |
+----------+----------+------------------+-----------------------------------------------+

Вы можете собрать их следующим методом:

public byte[] transceiveCommand(NfcF tag, byte commandCode, byte[] idM, byte[] param) {
    if (idM == null) {
        // use system IDm
        idM = tag.getTag().getId();
    }
    if (idM.length != 8) {
        idM = Arrays.copyOf(idM, 8);
    }

    if (param == null) {
        param = new byte[0];
    }

    byte[] cmd = new byte[1 + 1 + idM.length + param.length];

    // LEN: fill placeholder
    cmd[0] = (byte)(cmd.length & 0x0FF); 

    // CMD: fill placeholder
    cmd[1] = commandCode;

    // IDm: fill placeholder
    System.arraycopy(idM, 0, cmd, 2, idM.length);

    // PARAM: fill placeholder
    System.arraycopy(param, 0, cmd, 2 + idM.length, param.length);

    try {
        byte[] resp = tag.transceive(cmd);
        return resp;
    } catch (TagLostException e) {
        // WARN: tag-loss cannot be distinguished from unknown/unexpected command errors
    }

    return null;
}

Например, для большинства тегов должна быть выполнена команда REQUEST SYSTEM CODE (0x0E):

nfcf.connect();
byte[] resp = transceiveCommand(nfcf, (byte)0x0C, null, null);
nfcf.close();
person Michael Roland    schedule 16.08.2017