Как я могу создать объект тега в Android

Я пытаюсь использовать объект Tag для своего плагина Flutter. Используя MethodChannel, я могу вызывать функции Java, но мой объект Tag остается нулевым. Как мне правильно создать это намерение?

else if (call.method.equals("readTag")) {
      Intent intent = new Intent("android.intent.action.MAIN");
      Tag nfcTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

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


person notoriousJ    schedule 22.01.2021    source источник
comment
Вы уверены, что intent содержит значение по NfcAdapter.EXTRA_TAG ключу?   -  person fartem    schedule 22.01.2021
comment
да, попробовал NfcAdapter.EXTRA_TAG в отдельном приложении для Android, и это сработало   -  person notoriousJ    schedule 22.01.2021


Ответы (1)


Поскольку вы создали new и пустой Intent, читать из него нечего. Итак, как и ожидалось.

Intent - это просто общий класс хранения, обычно используемый для передачи данных в стандартном формате между одним действием и другим.

Они используют keys для передачи определенных данных между Activity. Одним из keys, используемых Системным действием NFC для передачи данных, связанных с NFC, в ваше действие, является ключ NfcAdapter.EXTRA_TAG.

Намерение не имеет ничего общего с фактическим чтением тега NFC, они просто используются как метод связи, чтобы попросить Системную активность NFC сделать что-то и как оно может вернуть данные.

Таким образом, вы можете создавать их где угодно, с большим количеством различного контента и передавать их любому Activity, чтобы передать ему данные или получить их для отправки данных.

Вы, кажется, плохо понимаете, как работает NFC в Android.
Основная концепция.

Старый API
Вы создаете Intent с сообщением в системное приложение NFC, в котором говорится, что я хотел бы получать данные об определенных типах данных NFC, когда они попадают в диапазон, вы отправляете это Intent сообщение System NFC Activity с использованием enableForegroundDispatch, когда приложение System NFC видит, что тег правильного типа входит в диапазон, оно создает Intent для хранения данных о теге NFC для отправки обратно в действие, которое его запросило. < br /> Используется общий метод межпроцессного взаимодействия.

Более новые API
Сделайте нечто подобное, когда enableReaderMode вы используете специальный метод NFC для повторной отправки данных о том, какие теги вас интересуют, и он отправляет обратно в более конкретном формате, когда видит тег запрошенного типа входит в диапазон.
Пример более нового API https://stackoverflow.com/a/64921434/2373819

Фильтр манифеста Фильтр манифеста не зависит от старого и нового API, он предназначен для хранения информации, которую системное приложение NFC может использовать, чтобы решить, следует ли запускать ваше приложение при обнаружении определенного типа карты NFC. . Их можно использовать как со старым, так и с новым API, но они передают сообщение Ìntent, используя те же поля, что и старый API, в ваше приложение, его можно читать и обрабатывать из onCreate с помощью getIntent.

Таким образом, создание new и пустое Intent и ожидание волшебного получения данных NFC неверно.

person Andrew    schedule 22.01.2021
comment
Значит, использование намерений вне класса активности не работает? - person notoriousJ; 22.01.2021
comment
Обновленный ответ: да, они работают вне класса активности, но, возможно, не так, как вы ожидали. - person Andrew; 22.01.2021
comment
Спасибо, Эндрю, после небольшого исследования я заметил, что документации по новому API enableReaderMode не так много. Возможно, вы знаете ссылку, которой вы могли бы поделиться, чтобы узнать о ней больше. - person notoriousJ; 23.01.2021
comment
Обновленный ответ, добавляющий ссылку на новый пример API, новый API имеет полную справочную документацию, только в нем нет руководства по его соединению, которое должен предоставить пример. Я также добавил, как фильтры манифеста вписываются в микс. - person Andrew; 23.01.2021