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

  1. Запускаем Termux на Android устройстве.

  2. Вызываем команду Termux:API. В Termux команды Termux API являются скриптами bash, в скрипте указывается команда Termux API,в параметрах которой передается какое действие Termux API необходимо выполнить.

  3. Программа Termux-API вызывает объект Termux API Reciever из пакета Termux API и передает объекту информацию, какое действие нужно выполнить и с какими параметрами. Названия действия и параметра программа Termux API получает из Bash-скрипта.

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

  5. Объект, вызванный Termux API Reciever, вызывает необходимые функции Android и ожидает результата.

  6. После получения ответа вызванный объект возвращает Termux API Reciever полученные данные, а тот, возвращает их обратно по всей цепочке вызовов.

Проблемы

Главной проблемой при реализации данной идеи являлось то, что для взаимодействия с NFC надо было обработать событие модуля NFC. Termux же не имеет такого механизма.

Решение

Взаимодействие с Termux делаем в модуле Termux API. Для чего создаем новое activity с необходимыми нам методами.

  1. Создаем новый класс являющийся наследником activity,нам это нужно, чтобы корректно обработать события от NFC модуля.

  2. В параметрах класса создаем 2 строковых переменных для хранения идентификаторов сокетов, через которые будут общаться наш класс и Termux.

  3. В методе OnCreate нужно обновлять актуальные значения сокетов из полученного intent-а, если этого не сделать программа будет падать с ошибками.

  4. Делаем обработку событий NFC как написано в мануалах Android.

  5. Делаем механизм обмена данными с Termux. Для Termux API это крайне важный шаг. Обмен Termux API с Termux выполняется с помощью класса ResultReturner (его необходимо импортировать из библиотеки com.termux.api.util.ResultReturner). Результат выполнения операции взаимодействия с NFC упаковываем в JSON стандартным JSON-райтером и передаем полученный объект классу ResultReturner.

    Важно, нужно обязательно перед завершением activity вне зависимости от результата работы с NFC передать результат работы в Termux с помощью класса ResultReturner, иначе вызов нашего activity будет порождать ошибки Termux, корректно не отработает деструктор класса и процесс зависнет.

  6. Всё.

Пример кода можно посмотреть в репозитории Termux API (NfcActivity.java)

Итог

На данный момент готова библиотека для записи/чтения простых NDEF меток.