Найти тему
Pavel Zlotarenchuk

Советы и подсказки по NFC на Android

Интерфейс NFC становится все более популярным. Платежи NFC имеют большой спрос. Компании открывают для себя преимущества этой технологии, которая подходит для передачи небольших объемов данных на очень короткие расстояния, а также для аутентификации пользователей с использованием NFC, где дальнейшая связь с передачей больших объемов данных осуществляется через Bluetooth.

Поскольку мы предлагали нашим клиентам разработку мобильных приложений , мы несколько раз внедряли связь NFC. Например, одно приложение использует этот интерфейс для чтения и записи конфигураций аппаратного устройства в микросхему памяти. Читайте о проблемах, с которыми мы столкнулись в процессе разработки. Мы покажем вам, как мы их решили.

Все начинается с фишек

NDEF Чипы NFC являются наиболее распространенным типом для считывания информации с использованием NFC. Например, чипы могут быть размещены в зоопарке рядом с клетками для животных, когда веб-страница для конкретного сайта открывается посетителям, когда телефон подключен к чипу NFC. Очень просто Но как работать с чипами, которые поддерживают разные технологии, и цель их использования немного сложнее?

Чтобы начать использовать чип NFC на вашем мобильном устройстве, вы должны иметь следующие строки, объявленные в файле AndroidManifest, чтобы предоставить вашему приложению доступ к NFC.

<manifest package="com.mdgroup.project" xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" />
<application>
. .
</manifest>

Технологии NFC подразделяются на три категории в соответствии с их приоритетом. ACTION_NDEF_DISCOVERED имеет самый высокий приоритет, ACTION_TECH_DISCOVERED имеет более низкий приоритет, а ACTION_TAG_DISCOVERED - самый низкий . Эти категории также должны быть объявлены в файле AndroidManifest, в частности, в разделе «Деятельность», где вы хотите сканировать чипы по NFC. Вы можете указать только те категории, которые ваше приложение планирует поддерживать. 

Теперь вставьте следующие строки:

<activity
android:name="com.dactylgroup.someproject.android.controller.SomeActivity"
android:launchMode="singleInstance"
android:theme="@style/AppTheme ">

<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

<meta-data
android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
</activity>

Файлы также важны

Возможно, вы заметили, что в конце предыдущего примера есть ссылка на файл ресурсов, который мы еще не упомянули. Это файл со списками технологий, которые приложение будет использовать. Файл имеет тип XML. Он будет расположен в ресурсах приложения, в частности в папке с именем xml, на которую также будет ссылаться в AndroidManifest. По умолчанию список выглядит так:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.IsoDep</tech>
<tech>android.nfc.tech.NfcA</tech>
<tech>android.nfc.tech.NfcB</tech>
<tech>android.nfc.tech.NfcF</tech>
<tech>android.nfc.tech.NfcV</tech>
<tech>android.nfc.tech.Ndef</tech>
<tech>android.nfc.tech.NdefFormatable</tech>
<tech>android.nfc.tech.MifareClassic</tech>
<tech>android.nfc.tech.MifareUltralight</tech>
</tech-list>
</resources>

Прочтите это перед копированием! В списке указано, что ваше устройство / чип NFC поддерживает все эти технологии. Если нет, устройство не распознает микросхему NFC как ACTION_TECH_DISCOVERED (второй приоритет), но как ACTION_TAG_DISCOVERED (категория самого низкого приоритета). Для поддержки многочиповых технологий необходимо определить несколько технических листов в одном и том же XML-файле, например, следующим образом:

<tech-list>
<tech>android.nfc.tech.IsoDep</tech>
<tech>android.nfc.tech.NfcA</tech>
</tech-list>
<tech-list>
<tech>android.nfc.tech.MifareUltralight</tech>
</tech-list>

Приоритетные вопросы

Может быть, вам интересно, кто заботится о каких-либо приоритетных категориях? Она должна быть особенно заинтересована в тебе. Если ваше приложение имеет последний приоритет и другое приложение, такое как ST25 NFC Tap , может считывать тот же чип с более высоким приоритетом, то система автоматически открывает второе приложение, а не ваше. Если оба приложения могут открывать технологии с одинаковым приоритетом, Android покажет вам диалог, в котором вы сможете выбрать, какое приложение вы хотите сделать.

Выиграй в тех-листе

Определите как можно более конкретный технический список. Ниже мы определили один для примера. Поскольку чип поддерживает обе технологии, Nexus 6P будет читать его как ACTION_TECH_DISCOVERED , а телефоны Samsung только как ACTION_TAG_DISCOVERED

Таким образом, мы увидим проблему приоритетов , упомянутую несколькими строками выше. Поскольку мы работали только с технологией NfcV, мы удалили вторую технологию NdefFormatable, и теперь телефон Samsung также обнаруживает чип как ACTION_TECH_DISCOVERED .

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.NfcV</tech>
<tech>android.nfc.tech.NdefFormatable</tech>
</tech-list>
</resources>

Если вы не знаете, какую технологию поддерживает ваша микросхема NFC, проще всего узнать об использовании STFC NFC Tap , который может показать вам поддерживаемые технологии на одном из экранов.

Теперь мы закрыли устройство обнаружения чипа NFC. Теперь давайте посмотрим, как общаться с чипом, т.е. читать и записывать данные.

-2

Связь с чипом

Если вы объявляете android: launchMode = "singleInstance" в AndroidManifest внутри тега действия (действия, в котором вы хотите сканировать чипы NFC), Android не создает действие снова и снова после каждого сканирования чипа, но создает его только как один экземпляр и открывает его после каждого сканирования.

При прикосновении к устройству памяти NFC внутри действия вызывается метод override fun onNewIntent (intent: Intent). Вы можете получить экземпляр Tag из намерения, полученного в параметре метода через intent.getParcelableExtra (NfcAdapter.EXTRA_TAG) .

Ориентирован на технологию NfcV

Следующий раздел будет посвящен технологии NfcV, которую мы использовали для наших целей. Для взаимодействия с чипом NFC вам необходим экземпляр класса NfcV, который вы получаете из тега намерения: val nfcV = NfcV.get (tag) .

Чтобы начать связь с чипом NFC, просто введите nfcV.connect () . Для прекращения связи введите nfcV.close () . Как просто Для чтения / записи данных используйте метод nfcV.transceive (readParams: ByteArray) . Параметры для метода transceive являются наиболее важными в этом процессе. Здесь вы можете указать, хотите ли вы читать или записывать данные, сколько блоков записывать или читать, где начинать запись или чтение и т. Д. Это сложная часть, которая может быть указана в одной из наших других статей.
Метод transceive также приводит к созданию ByteArray, который можно преобразовать в шестнадцатеричную строку и затем обработать для следующей цели.

Если параметры, указанные для метода transceive, указывают на запись, выходные данные метода определяют результат запрошенной операции. Если вы снова конвертируете этот результат в шестнадцатеричную строку, вы получите код, имеющий форму «00» для успешного ввода. См. Полную документацию с командами чтения / записи, всеми выходными кодами и многим другим.

В частности, коды ответов после записи доступны на стр. 22.

Полезный совет в конце

Если у вас есть приложение, открытое и коснувшееся устройства с чипом NFC, система отобразит системное диалоговое окно, чтобы выбрать приложение для выполнения операции. Это может быть очень раздражающим при повторном использовании. Вы можете решить эту проблему, используя систему диспетчеризации переднего плана , исходный код которой можно найти по ссылке. Используйте это. Код в документации использует те же правила, что и выше: Определите категорию NFC с наивысшим приоритетом, которую может поддерживать ваш чип, и укажите только те технологии NFC, которые вы используете.

Мы надеемся, что статья, в которой мы показали некоторые основные советы по работе с NFC, поможет вам в вашей работе.

P.S. Прошу прощение за то в каком виде вставлял код, к сожалению вставка с github невозможна(.