Взаимодействие с NFC через Termux API

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 меток.

Tags:
android development, termux, nfc

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.