В этом файле фильтра указаны два типа меток, которые активность желает видеть. Метка NFC обычно имеет собственный список технологий. Если один из дескрипторов . является подмножеством списка технологий метки, это трактуется как соответствие, и активность получит это намерение метки NFC.
. первый тип метки имеет технологии NfcA и MifareUltralight, а второй тип — технологии NfcB и Ndef. Добавив в этот файл дополнительные дескрипторы , можно указать дополнительные метки, которые будет ожидать наша активность. Список доступных технологий, которые могут быть помещены в данный файл — это имена классов меток, определенные в пакете android.nfc.tech, но добавляйте только то, что должно получать ваша активность. В дочерних дескрипторах указываются все технологии, которые метка должна сообщать для своего намерения, чтобы соответствовать нашей активности. Все технологии в отдельном дескрипторе должны существовать в списке технологий, который сообщается меткой. Таким образом, для достижения соответствия список технологий в фильтре намерений может иметь меньшее количество технологий, чем сообщает метка, но не большее их число. Для примера фильтра из., если метка представляет только одну технологию Ndef, она не будет соответствовать ни одной из спецификаций, и активность не получит намерение. Ни один из списков фильтра намерений не является подмножеством такого списка из метки. Если метка имеет технологии NfcA, NfcB и Ndef, будет найдено соответствие со второй спецификацией, поэтому активность получит намерение. Второй список является подмножеством списка технологий метки. Соответствие будет найдено, несмотря на то, что метка сообщает на одну технологию больше, чем содержится в списке технологий фильтра намерений.
Финальный фильтр намерений, который вы можете использовать, .; он представляет собой фильтр, перехватывающий все намерения. То есть, если метка принята, но для обработки намерения не найдено активности NDEF или технологии, либо метка оказалась неизвестного типа, намерение будет создано с действием ACTION_TAG_DIS COVE RED.
Обратите внимание, что в этом фильтре намерений отсутствуют дескрипторы и , поскольку в намерении, имеющем действие ACTION_TAG_DISCOVERED, никаких данных не будет. Это, как правило, означает, необходимость в наличии дескриптора . Однако это не случай с намерениями меток NFC. Намерения меток NFC являются специальными, поэтому для сопоставления с ними дескрипторы в фильтрах намерений не требуются.
Возвращаясь к нашему потоку поиска соответствия с меткой, если мы получаем намерение ACTION_TAG_DISCOVERED, среда Android в основном отказалась от попыток найти активность для обнаруженной метки NFC. В этот момент любая активность, которая принимает действие ACTION_TAG_DISCOVERED, получит эти намерения меток. В большинстве обычных операций вы даже не у намерение метки ACTION_TAG_ DISCOVERED, потому что почти все метки NFC, с которыми вам придется столкнуться, будут соответствовать по ACTION_NDEF_DISCOVERED или ACTION_TECH_DISCOVERED.
Существует еще один способ получения активностью намерения метки NFC, который предусматривает использование системы диспетчеризации переднего плана. Если активность выполняется на переднем плане (это означает, что onResume инициируется или был запущен, и пользователь может взаимодействовать с активностью), можно применить следующий вызов:
mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
Здесь mAdapter — это адаптер NFC, а this — ссылка на активность. С помощью этого вызова вы помещаете свою активность поверх всех остальных, и если какой-то из фильтров намерений этой активности обнаружит совпадение с найденной меткой, ваша активность обработает ее. Если активность не получает намерение метки NFC, из-за того что оно не соответствует настройке этого вызова, намерение метки NFC будет пытаться соответствовать другим активностям с использованием описанной выше логики. Этот метод должен быть вызван в потоке пользовательского интерфейса, и самое подходящее место для этого — метод onResume активности. Также понадобится следующий вызов:
mAdapter.disableForegroundDispatch(this);
внутри метода обратного вызова onPause активности, чтобы она не получала намерение, когда обработка его невозможна. Если активность получает намерение подобным образом, обратный вызов onNewIntent будет использоваться для его приема в активности.
Ожидающее намерение является стандартным. intentFiltersArray может быть коллекцией желаемых объектов IntentFilter, каждый из которых описывает соответствующее действие и любые необходимые данные или типы MIME. Например, . показан код создания фильтра намерений для Ndef и добавления его в массив. https://1zakon.su/advokat/
Помните, что массив фильтров намерений может содержать множество экземпляров IntentFilter, причем каждый может устанавливать то же самое или другое действие и иметь либо не иметь данные и/или значения полей типов.
Здесь techListsArray — это массив массивов, где каждый внутренний массив представляет собой список имен классов, которые может перечислять метка. Допускается иметь множество списков имен классов для поиска сопоставления. . пример, который эквивалентен ресурсному файлу списка технологий из. Этот код также, скорее всего, будет присутствовать в методе onCreate .
После того как вся эта настройка сделана, когда активность получает намерение метки NFC, инициируется обратный вызов onNewIntent, который предназначен для приема намерения. Далее можно получать доступ к дополнительному пакету для чтения метки; это будет рассматриваться в следующем разделе. Динамическое затребование намерения метки NFC требует немалой работы, но, с другой стороны, если нужно, чтобы уже запущенная пользователем активность получила метки, это оказывается единственным способом решения проблемы. Обратите внимание, что для приема намерений меток NFC, скорее всего, мало смысла использовать этот метод и также иметь фильтры намерений в файле манифеста, тем не менее, формально это возможно.
|