Как прочитать текстовую запись на карте NFC Mifare Classic 1K в Android

введите описание изображения здесь Я новичок в Java-программисте, работаю над проектом чтения NFC. Я пытался прочитать содержимое карты NFC в Android, но не могу заставить ее работать. Я могу получить только UID карты NFC. Я просмотрел документацию по NFC в Android, а также несколько руководств, но я не очень в этом разбираюсь. Я много искал, но не нашел четкого решения или статьи о чтении текстовых записей Mifare Classic 1K. Как я могу этого добиться? На самом деле я ничего не знаю, поэтому, пожалуйста, извините меня, если вопрос немного неясен. Я использую настольное приложение инструментов NFC для записи текстовых записей (скриншот ниже) Я буду признателен за любую помощь. заранее спасибо

Здесь фрагмент кода, который я использую для извлечения записей после получения намерения на Android


    private void readFromIntent(Intent intent) {
        System.out.println("Came huered ");
        String action = intent.getAction();
        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)
                || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)
                || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
           
            Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
            NdefMessage[] messages ;
            
            if (rawMessages != null) {
                messages = new NdefMessage[rawMessages.length];
                for (int i = 0; i < rawMessages.length; i++) {
                    messages[i] = (NdefMessage) rawMessages[i];
                    NdefRecord [] records = messages[i].getRecords();
                    System.out.println("RECORDS "+records);
                    //if you are sure you have text then you don't need to test TNF
                    for(NdefRecord record: records){
                        processRecord(record);
                    }
                }
            }
        }
    }
public void processRecord(NdefRecord record) {

        short tnf = record.getTnf();
        switch (tnf) {


            case NdefRecord.TNF_MIME_MEDIA: {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    if (record.toMimeType().equals("MIME/Type")) {
                        // handle this as you want
                        System.out.println("HEREEEE");
                    } else {
                        //Record is not our MIME
                    }
                }
            }
            // you can write more cases
            default: {
                //unsupported NDEF Record
            }
        }
    }

Вы проверили, поддерживаются ли карты Mifare Classic на вашем оборудовании Android? Карты Mifare Classic не соответствуют стандартам NFC и не поддерживаются на всех устройствах Android. Также, чтобы люди могли помочь, вы должны показать, какой код вы сделали до сих пор, пытаясь прочитать эти карты.

Andrew 17.05.2022 12:19

@Андрей спасибо за ответ. Да, карты Mifare classic поддерживаются на моем устройстве.

Ousmane Elhadji 17.05.2022 12:31

Как вы обеспечиваете доставку данных Intent с тегом в ваше приложение? Есть ли у вас записи манифеста, чтобы система запускала ваше приложение и доставляла Intent с данными тега для чтения в onCreateили вы использовали enableForegroundDispatch для его доставки в onNewIntent?

Andrew 17.05.2022 12:54

onNewIntent Я попытался вызвать действие ACTION_TAG_DISCOVERED, и оно считывает тег. Да, все настроено в моем файле манифеста. Я также использовал enableForegroundDispach в своем методе onResume. вот ссылка на мой файл: github.com/ousmane12/FizzBuzz/blob/master/ScanActivity.java

Ousmane Elhadji 17.05.2022 13:17
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
4
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша обработка записи не ищет текстовую запись Ndef.

case NdefRecord.TNF_MIME_MEDIA: {

не подходит для текстовых записей

использовать

short tnf = record.getTnf();
byte[] type = record.getType();

if (tnf == NdefRecord.TNF_WELL_KNOWN &&
        Arrays.equals(type, NdefRecord.RTD_TEXT) {
  // Correct TNF and Type for Text record
  // Now process the Text Record encoding
}

Обратите внимание, что toMimeType действительно преобразует RTD_TEXT в мим-тип, но для этого

if (record.toMimeType().equals("MIME/Type")) {

нужно было бы

if (record.toMimeType().equals("text/plain")) {

Для обработки текстовой записи см. https://stackoverflow.com/a/59515909/2373819

Обновить

Надо было еще сказать, что

if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)
                || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)
                || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {

неверно, поскольку вы пытаетесь проанализировать данные Ndef, когда в теге нет данных Ndef.

должно быть

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {

обновление2 Я проверил ссылку github на код, который вы дали

Он не сработает для записей Ndef, потому что вы тестируете неправильный тип Intent.

Система отправки Intent отправляет только наивысший тип NFC Intent, возможный с заказом, как: -

ACTION_NDEF_DISCOVERED -> ACTION_TECH_DISCOVERED -> ACTION_TAG_DISCOVERED

Поэтому, если тег содержит данные NDEF, устанавливается только тип действия ACTION_NDEF_DISCOVERED.

Таким образом

public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)) {
...

никогда не будет запускать обработку Intent

этот код должен быть

public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if (intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED)) {
...

Спасибо за ваш ответ. Я постараюсь вернуться к вам

Ousmane Elhadji 17.05.2022 13:41

Я попробовал ваше решение, но оно даже не запускает метод processRecord, потому что намерение.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGE‌​S) равно null

Ousmane Elhadji 17.05.2022 14:09

Я только что видел ваши обновления. Я заменил свой onNewIntent, но, похоже, я вообще не понимаю этого намерения.

Ousmane Elhadji 17.05.2022 14:55

Использование enableForegroundDispatch — не лучший API, и у него есть ряд недостатков, есть лучший и более новый API NFC под названием enableReaderMode, пример которого находится по адресу stackoverflow.com/a/64921434/2373819.

Andrew 17.05.2022 15:00

Спасибо за ваше руководство. Я тоже так делал, но без изменений. Я обновил свой код здесь github.com/ousmane12/FizzBuzz/blob/master/ScanActivity.java, пожалуйста, проверьте его

Ousmane Elhadji 17.05.2022 17:40

Это возвращает меня к моему первому вопросу: «Вы проверяли, поддерживаются ли карты Mifare Classic на вашем оборудовании Android?» Как вы это проверили? Поскольку этот пример кода полностью протестирован и работает, похоже, вы реализовали его нормально. Я предлагаю вам использовать приложение NXP TagInfo play.google.com/store/apps/… и перечислить сведения о технологии тегов из полного сканирования карты.

Andrew 17.05.2022 17:57

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