Прежде всего LOL для заголовка вопроса.Я был в той же ситуации, когда был новичком.В Интернете нет учебника, в котором вы найдете точный код для чтения данных с классической карты Mifare.
Сначала разберитесь со структурой памяти карт Mifare.
Память Mifare Classic разделена на сектора., которые также делятся на блоки по 16 байт.
Карта MIFARE Classic 1K имеет 16 секторов, каждый из которых разделен на четыре блока.Если мы посчитаем, мы сможем понять, как будет выглядеть структура памяти: 16 байтов (1 блок) * 4 блока * 16 секторов = 1024 байта.
![enter image description here](https://i.stack.imgur.com/plOGy.png)
Карта MIFARE Classic 4K имеет 40 секторов, 32 из которых разделены на четыре блока, а остальные 8 разделены на 16 блоков.16 байтов (1 блок) * 4 блока * 32 сектора + 16 байтов (1 блок) * 16 блоков * 8 секторов = 4096 байтов.Структура памяти следующая:
![enter image description here](https://i.stack.imgur.com/AkNNv.png)
Число в блоках указывает его индекс.Каждый сектор защищен ключом сайта, записанным в последнем блоке сектора.Например, блок 3 содержит ключ сайта для сектора 1 и блок 7 для сектора 2. Последний блок в каждом секторе также содержит информацию об условиях доступа, такую как «запись», «чтение» и «чтение и запись».На следующем рисунке показано, из чего состоит последний блок:
![enter image description here](https://i.stack.imgur.com/8Q9ZB.png)
Кроме того, данные, записанные на карте, являются двоичными, т.е.0 & 1.
Теперь для чтения данных необходимо выполнить следующие шаги:
step1: проверить, поддерживает ли устройство NFC или нет.
step2: проверитьесли устройство оснащено микросхемой NXP (особенно для чтения классических карт Mifare).
step3: создать экземпляр NFC-менеджера и NFC-adpater и определить технический список карт, которые вы хотите прочитать.
step4:запросить разрешение на доступ к устройству NFC.
step5: создать намерение обнаружить карту и указать тип MIME, который вы хотите прочитать (в большинстве случаев это все типы MIME).
step6: включитьи отключите приоритетную отправку адаптера в onResume () и onPause (), чтобы ваше приложение получило приоритет для чтения карты, когда ваша деятельность находится на переднем плане.
step7: Когда карта входит в контакт с устройством, вы можетеполучить информацию тега от intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
step8: прочитать информацию о карте, т.е.тип карты, технический список и т. д.
step9: для чтения данных на карте необходимо подключиться к карте с помощью информации тега, полученной выше.
step10: выполнить итерацию по всем секторам.Аутентифицируйте каждый сектор с помощью ключа по умолчанию // https://developer.android.com/reference/android/nfc/tech/MifareClassic.html#authenticateSectorWithKeyA(int,%20byte[])
step11: при успешной аутентификации считайте двоичные данные в блоках каждого сектора.
step12: преобразуйте двоичные данные в строковые данные так, чтобычто мы можем его прочитать.
step13: Вот и все, делайте все, что вы хотите с данными.
сюрприз!получите полный рабочий код в моем репозитории github здесь: https://github.com/codes29/RFIDReader
Примечание: я сочувствовал, как вы себя чувствуете как новичок, и получил эту задачу, где нет соответствующего учебника для того же.Поэтому я обновил свой код, который написал после многих дней борьбы.
Вот пример, который вы получите после успешной аутентификации и чтения данных.Карта, которую я отсканировал, пуста, как сейчас.Но если здесь есть данные, то они наверняка будут здесь вместо 0.
![/tmp/mozilla_mobulous0/Screenshot_20190221-124444.png](https://i.stack.imgur.com/tlQMR.png)
Ура!Приятного кодирования, братан!