Termux - это терминал для Android предоставляющий доступ к командной строке Linux. Особенность Termux состоит в том, что его возможности расширяются при помощи огромной коллекции пакетов программного обеспечения портированного на Android. Однако для Termux до сих пор не существовало библиотеки, которая позволяла бы работать с NFC,что я решил исправить. Для того, чтобы из командной строки Termux обратиться к функциям Android, используется пакет Termux API, который поставляется как отдельное программное обеспечение, и является аддоном к Termux. Вызов методов Android из Termux выполняется следующим образом:
Запускаем Termux на Android устройстве.
Вызываем команду Termux:API. В Termux команды Termux API являются скриптами bash, в скрипте указывается команда Termux API,в параметрах которой передается какое действие Termux API необходимо выполнить.
Программа Termux-API вызывает объект Termux API Reciever из пакета Termux API и передает объекту информацию, какое действие нужно выполнить и с какими параметрами. Названия действия и параметра программа Termux API получает из Bash-скрипта.
Termux API Reciever находит по названию действия объект, который может его выполнить и вызывает этот объект, с параметрами, полученными от программы Termux API.
Объект, вызванный Termux API Reciever, вызывает необходимые функции Android и ожидает результата.
После получения ответа вызванный объект возвращает Termux API Reciever полученные данные, а тот, возвращает их обратно по всей цепочке вызовов.
Проблемы
Главной проблемой при реализации данной идеи являлось то, что для взаимодействия с NFC надо было обработать событие модуля NFC. Termux же не имеет такого механизма.
Решение
Взаимодействие с Termux делаем в модуле Termux API. Для чего создаем новое activity с необходимыми нам методами.
Создаем новый класс являющийся наследником activity,нам это нужно, чтобы корректно обработать события от NFC модуля.
В параметрах класса создаем 2 строковых переменных для хранения идентификаторов сокетов, через которые будут общаться наш класс и Termux.
В методе OnCreate нужно обновлять актуальные значения сокетов из полученного intent-а, если этого не сделать программа будет падать с ошибками.
Делаем обработку событий NFC как написано в мануалах Android.
Делаем механизм обмена данными с Termux. Для Termux API это крайне важный шаг. Обмен Termux API с Termux выполняется с помощью класса ResultReturner (его необходимо импортировать из библиотеки com.termux.api.util.ResultReturner). Результат выполнения операции взаимодействия с NFC упаковываем в JSON стандартным JSON-райтером и передаем полученный объект классу ResultReturner.
Важно, нужно обязательно перед завершением activity вне зависимости от результата работы с NFC передать результат работы в Termux с помощью класса ResultReturner, иначе вызов нашего activity будет порождать ошибки Termux, корректно не отработает деструктор класса и процесс зависнет.
Всё.
Пример кода можно посмотреть в репозитории Termux API (NfcActivity.java)
Итог
На данный момент готова библиотека для записи/чтения простых NDEF меток.