В чем разница между enableReaderMode и enableForegroundDispatch?

Я нашел два способа позволить приложению Android обнаруживать и обрабатывать теги NFC:

  1. NfcAdapter.enableReaderMode(activity, callback, flags, extras), а затем получить информацию о теге в обратном вызове.

  2. NfcAdapter.enableForegroundDispatch(activity, intent, filters, techLists), а затем получить информацию о теге в методе активности onNewIntent(intent).

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

Так в чем же разница между enableReaderMode и enableForegroundDispatch?


person Héctor    schedule 10.11.2015    source источник
comment
Вы когда-нибудь использовали enableReaderMode?   -  person IgorGanapolsky    schedule 20.08.2020


Ответы (2)


Система диспетчеризации переднего плана

Система диспетчеризации переднего плана (NfcAdapter.enableForegroundDispatch()) существует, начиная с Android 2.3.3 (которая, по сути, является началом Android NFC). Следовательно, этот метод поддерживается на всех устройствах Android с возможностями NFC.

Система диспетчеризации переднего плана используется для предоставления действия, которое в настоящее время находится в приоритете переднего плана, при обработке событий обнаружения NFC (т. е. обнаруженных тегов NFC и сообщений NDEF, полученных от одноранговых устройств). Это означает, что даже если другое приложение зарегистрировано (с помощью фильтра намерений в AndroidManifest.xml) для определенного типа тега или данных NDEF, событие NFC все равно будет передано активному действию вместо этого другого действия. Следовательно, этот метод не меняет способ, которым Android прослушивает устройства NFC (теги NFC, устройства P2P), он только изменяет приоритет обработки обнаруженных устройств.

API режима чтения

API режима чтения (NfcAdapter.enableReaderMode()) был представлен в Android 4.4. Следовательно, не все устройства Android с возможностями NFC поддерживают этот метод.

В отличие от системы диспетчеризации переднего плана, API-интерфейс режима чтения меняет способ, которым Android прослушивает устройства NFC. API режима чтения отключает одноранговый режим. Это, например, позволяет вам обнаруживать режим эмуляции карты других устройств, на которых одновременно включены одноранговый режим и режим эмуляции карты (как в случае с Android HCE). (Обычно такое устройство будет обнаружено как одноранговое устройство, и приложение Android не сможет получить доступ к функции эмуляции карты.)

Кроме того, вы можете изменить определенные параметры режима считывателя NFC, например. ты сможешь:

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

Примечание. На Android 10 поведение может отличаться.

Согласно комментарию Адама Джонса, приведенное выше может быть неверным для Android 10 (он тестировал на Pixel 2). При использовании только enableReaderMode() (без дополнительного enableForegroundDispatch()) устройства, похоже, отображают тост «Нет поддерживаемого приложения для этого тега NFC», хотя теги правильно отправляются зарегистрированному методу обратного вызова режима чтения (onTagDiscovered()).

person Michael Roland    schedule 18.11.2015
comment
Михаил, очень полезная информация. Спасибо! Еще один вопрос: если я включу режим чтения в своей активности переднего плана, означает ли это, что он также переопределит существующую систему диспетчеризации тегов, как это делает система диспетчеризации переднего плана? - person Yash; 15.07.2016
comment
@Yashasvi Да, режим чтения также переопределяет отправку всех других тегов. - person Michael Roland; 17.07.2016
comment
@MichaelRoland, в Android 10 больше не кажется правдой то, что enableReaderMode переопределяет всю другую отправку тегов. Я получаю всплывающее сообщение от ОС Android при сканировании тега после вызова enableReaderMode, в котором говорится, что для этого тега NFC нет поддерживаемого приложения. Однако я все еще получаю тег в обратном вызове onTagDiscovered и обрабатываю его как обычно. Однако использование enableForegroundDispatch предотвращает отображение всплывающего уведомления ОС Android. - person Adam Johns; 25.03.2020
comment
@AdamJohns Это на устройстве Google Pixel или на устройстве стороннего OEM-производителя? - person Michael Roland; 30.03.2020
comment
@MichaelRoland, Google Pixel 2 - person Adam Johns; 30.03.2020
comment
Подробнее в моем вопросе здесь: stackoverflow.com/q/60868912/1438339 - person Adam Johns; 01.04.2020
comment
@MichaelRoland В моем случае приложение должно считывать теги NFC, а также телефоны Android (от HCE). В настоящее время я использую систему диспетчеризации переднего плана, и она обнаруживает оба типа. Но обнаружение телефонов Android прерывисто на разных устройствах. На Nexus 9 срабатывает 9/10 раз, но на некоторых телефонах Huawei и LG детект действительно плохой. Должен ли я переключиться на enableReaderMode или использовать как FDS, так и readerMode? - person Purush Pawar; 05.05.2020
comment
@igorganapolsky да. Сообщение NDEF — это только одна возможная конкретная структура данных, которую можно извлечь из тега. - person Michael Roland; 21.08.2020

enableReaderMode: Ограничьте контроллер NFC режимом чтения, пока это действие находится на переднем плане.

enableForegroundDispatch: Это даст приоритет активности переднего плана при отправке обнаруженного тега в приложение.

Таким образом, вы можете использовать оба для одной и той же цели, а именно для чтения/записи тега. enableReaderMode используется телефонами Android в сочетании с контроллером Broadcom NFC, потому что есть ошибка проверки присутствия. Насколько я знаю, только enableReaderMode могут увернуться от этого, увеличив EXTRA_READER_PRESENCE_CHECK_DELAY.

person S.Pols    schedule 11.11.2015
comment
Есть ли еще упомянутая ошибка в Android R? - person IgorGanapolsky; 20.08.2020
comment
Можно ли надежно использовать оба одновременно? т.е. использование enableForegroundDispatch для придания приоритета текущей активности (и, таким образом, также блокировки всех других приложений), но фактически не прислушиваясь к намерениям. Затем в то же время использовать enableReaderMode для фактического чтения? - person ropsnou; 07.03.2021
comment
@ropsnou, вы использовали оба из них? И с какой целью? - person Johan Ferreira; 16.03.2021
comment
@JohanFerreira Нет. После некоторого тестирования стало ясно, что достаточно использовать только enableReaderMode. - person ropsnou; 16.03.2021